微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android自定义适配器,未在其他线程上调用setAdapter

如何解决Android自定义适配器,未在其他线程上调用setAdapter

我正在使用swipestack(实现'link.fls:swipestack:0.3.0')。数据是从Firebase RT DB获取的,因此我需要等待3秒钟才能调用setCardStackAdapter。但是在那种情况下,不会在主线程上调用setAdapter,并且什么也没有显示,然后不调用getView本身。 而且,如果我删除了3秒的等待时间,则不会下载数据,并且会出现空指针异常。

package com.example.signin;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import link.fls.swipestack.Swipestack;

public class Swipe extends AppCompatActivity {

    private Swipestack cardStack;
    private SwipestackAdapter cardsAdapter;
    private ArrayList<CardItem> cardItems;
    private View btnCancel;
    private View btnlove;
    private int currentPosition;
    DatabaseReference QsDB;
   // ListView lv;
    List<QuestionSet> qsList;
    QuestionSet selectedQS;
    //String [] keys;
    List<String> keys;
    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_swipe);

        cardStack = (Swipestack) findViewById(R.id.container);
        btnCancel = findViewById(R.id.cancel);
        btnlove = findViewById(R.id.love);
        QsDB = FirebaseDatabase.getInstance().getReference("XXXXXX");
        qsList = new ArrayList<>();
        keys = new ArrayList<>();

        Handler handler=new Handler();
        Runnable r=new Runnable() {
            public void run() {
                setCardStackAdapter();
            }
        };
        handler.postDelayed(r,3000);

        //Cant call setCardAdapter directly as data fetch from Firebase RT SB is taking some time
//        setCardStackAdapter();
//And if I remove wait then setCardAdapter is called even before data is downloaded,thud it gives NullPointerException then

        currentPosition = 0;  
    }

    public void onStart() {
        super.onStart();
        QsDB.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                qsList.clear();
                System.out.println("Hereeee is count- " + snapshot.getChildrenCount());
                for (DataSnapshot qsDS : snapshot.getChildren()) {
                    keys.add(qsDS.getKey());
                    i++;
                    QuestionSet qsset = qsDS.getValue(QuestionSet.class);
                    qsset.setKey(qsDS.getKey());
                    qsList.add(qsset);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }



    private void setCardStackAdapter() {
        cardItems = new ArrayList<>();
        Collections.shuffle(qsList);
//        for (int v=0; v<qsList.size(); v++) {
//        for (int v=0; v<3; v++) {
//            System.out.println("Going to set data Now..."+v+" id="+qsList.get(v).getKey());
//            String [] x = (qsList.get(v).getop1()).split(";");
//            String [] y = qsList.get(v).getop2().split(";");
//            cardItems.add(new CardItem(R.drawable.border,qsList.get(v).getQs1(),qsList.get(v).getop1(),x[0],x[1],x[2],x[3]));
//            cardItems.add(new CardItem(R.drawable.border_2,qsList.get(v).getQs2(),qsList.get(v).getop2(),y[0],y[1],y[2],y[3]));
//        }


        cardItems.add(new CardItem(R.drawable.border,"Huyen My","Hanoi","a","b","c","d"));
        cardItems.add(new CardItem(R.drawable.border_2,"Do Ha","Nghe An","d"));

        cardsAdapter = new SwipestackAdapter(this,cardItems);
        cardStack.setAdapter(cardsAdapter);
    }
}

This is my Adapter Class

package com.example.signin;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.TextView;

import java.util.List;

public class SwipestackAdapter extends BaseAdapter {
    public static int c=0;
    private Activity activity;
    private final static int AVATAR_WIDTH = 150;
    private final static int AVATAR_HEIGHT = 300;
    private List<CardItem> data;

    public SwipestackAdapter(Activity activity,List<CardItem> data) {
        System.out.println("Constuctor called");
        this.data = data;
        this.activity = activity;
    }

    @Override
    public int getCount() {
        System.out.println("getCount="+data.size());
        return data.size();
    }

    @Override
    public CardItem getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position,View convertView,ViewGroup parent) {
        System.out.println("GetView called");
        ViewHolder holder;
        LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        // If holder not exist then locate all view from UI file.
        if (convertView == null) {
            System.out.println("null wala called");
            // inflate UI from XML file
            convertView = inflater.inflate(R.layout.item_card,parent,false);
            // get all UI view
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            System.out.println("Else wala called");
            // if holder created,get tag from view
            holder = (ViewHolder) convertView.getTag();
        }

        //setting data to views
//        holder.name.setText(getItem(position).getName());
//        holder.location.setText(getItem(position).getLocation());
////        holder.avatar.setimageBitmap(decodeSampledBitmapFromresource(activity.getResources(),////                getItem(position).getDrawableId(),AVATAR_WIDTH,AVATAR_HEIGHT));
//        holder.r1.setText(getItem(position).getR1());
//        holder.r2.setText(getItem(position).getR2());
//        holder.r3.setText(getItem(position).getR3());
//        holder.r4.setText(getItem(position).getR4());
        holder.main.setBackgroundResource(getItem(position).getDrawableId());
        return convertView;
    }

    private class ViewHolder{
        private TextView avatar;
        private TextView name;
        private TextView location;
        private LinearLayout main;
        private RadioButton r1,r2,r3,r4;

        public ViewHolder(View view) {
            avatar = (TextView)view.findViewById(R.id.avatar);
            name = (TextView)view.findViewById(R.id.name);
           // location = (TextView)view.findViewById(R.id.location);
            main = (LinearLayout) view.findViewById(R.id.mainLL);
            r1 = (RadioButton) view.findViewById(R.id.rd1);
            r2 = (RadioButton) view.findViewById(R.id.rd2);
            r3 = (RadioButton) view.findViewById(R.id.rd3);
            r4 = (RadioButton) view.findViewById(R.id.rd4);
        }
    }


}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。