如何解决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 举报,一经查实,本站将立刻删除。