我有從數據庫中填充的listview。Android ListView在就緒或初始化偵聽器上
listview需要一些時間(< 300ms)來填充列表。
如果我做一個smoothScrollToPosition在onActivityCreated功能是什麼都不做。
在OnCreate中的功能,我不得不等待〜200毫秒之前,我可以打電話smoothScrollToPosition甚至ListView控件對象未初始化之前它。
我可以使用下面的getViewTreeObserver,它運行良好,但它需要最低sdk版本16.我試圖讓它在版本14〜15中工作。
mListView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mListView.smoothScrollToPosition(adapter.getCount());
// unregister listener (this is important)
mListView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
我遇到的代碼 -
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
list = new ArrayList<Chat>();
db = new DBAdapter(getContext());
adapter = new CustomChatAdapter(getContext(), list);
Log.d("ListView1", "Value of f: " + f);
thread= new Thread(){
@Override
public void run(){
try {
synchronized(this){
wait(200);
}
}
catch(InterruptedException ex){
Log.d("ListView1", "Interrupted Exception: " +ex.toString());
}
Log.d("ListView1", "Adapter Count: " +adapter.getCount());
mListView.smoothScrollToPosition(adapter.getCount());
}
};
getMsg("1", getActivity().getIntent().getStringExtra("key"));
thread.start();
Log.d("ListView1", "Adapter Count: " +adapter.getCount());
//mListView.smoothScrollToPosition(adapter.getCount());
}
public void getMsg(String myid, String friend_id) {
list.clear();
try {
Cursor cur = db.get_friend_shouts(myid,friend_id);
String img_id1 = "";
String img_id2 ="";
if (cur != null) {
if (cur.moveToFirst()) {
do {
img_id1 = cur.getString(cur.getColumnIndex("image_id"));
img_id1 = img_id1 == null ? "null" : img_id1;
img_id2 = cur.getString(cur.getColumnIndex("r_img_id"));
img_id2 = img_id2 == null ? "null" : img_id2;
list.add(new Chat(img_id1 , cur.getString(cur.getColumnIndex("firstname")) + " " + cur.getString(cur.getColumnIndex("lastname")), cur.getString(cur.getColumnIndex("user_id")),
cur.getString(cur.getColumnIndex("shout_msg")) ,
img_id2, cur.getString(cur.getColumnIndex("r_firstname")) + " " + cur.getString(cur.getColumnIndex("r_lastname")) , cur.getString(cur.getColumnIndex("r_user_id")) , cur.getString(cur.getColumnIndex("rec_time")) ));
//Log.d("ListView1", "User details: " + cur.getString(cur.getColumnIndex("user_id")) + " " + cur.getString(cur.getColumnIndex("firstname")) + cur.getString(cur.getColumnIndex("lastname")) + " " + cur.getString(cur.getColumnIndex("image_id")));
} while (cur.moveToNext());
}
}
adapter.notifyDataSetChanged();
if(mListView!=null)
mListView.smoothScrollToPosition(adapter.getCount());
} catch (Exception e) {
Log.d("ListView1", "getMsg Error: " + e.toString());
}
}
一個ArrayAdapter類 -
public class CustomChatAdapter extends ArrayAdapter<Chat> {
private final Context context;
private final List<Chat> list;
public CustomChatAdapter(Context context, ArrayList<Chat> presidents) {
super(context, R.layout.chatrowlayout, presidents);
this.context = context;
this.list = presidents;
}
static class ViewContainer { public ImageView imageView; public TextView txtMsg; public ImageView imageView1; public TextView txtTime; }
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewContainer viewContainer;
View rowView = view;
//---print the index of the row to examine---
//Log.d("ListView1",String.valueOf(position));
//if(rowView == null) {
viewContainer = new ViewContainer();
LayoutInflater inflater = LayoutInflater.from(context);
rowView= inflater.inflate(R.layout.chatrowlayout, null, true);
viewContainer.txtMsg = (TextView) rowView.findViewById(R.id.msgText);
viewContainer.imageView = (ImageView) rowView.findViewById(R.id.icon1);
viewContainer.imageView1 = (ImageView) rowView.findViewById(R.id.icon2);
viewContainer.txtTime = (TextView) rowView.findViewById(R.id.timeText);
rowView.setTag(viewContainer);
/*} else {
viewContainer = (ViewContainer) rowView.getTag();
}*/
viewContainer.txtMsg.setText(list.get(position).getMsg());
viewContainer.txtTime.setText(list.get(position).getMsg_time());
if(list.get(position).getS_id().equals("1")) {
viewContainer.imageView.setImageBitmap(BitmapFactory.decodeFile(new Info().p + File.separator+ "image_" + list.get(position).getPic_id1() + ".jpeg"));
viewContainer.imageView1.setAlpha(0);
viewContainer.txtMsg.setGravity(Gravity.LEFT);
} else {
viewContainer.imageView1.setImageBitmap(BitmapFactory.decodeFile(new Info().p + File.separator+ "image_" + list.get(position).getPic_id1() + ".jpeg"));
viewContainer.imageView.setAlpha(0);
viewContainer.txtMsg.setGravity(Gravity.RIGHT);
}
return rowView;
}
}
您可以發佈您的適配器代碼,以便我們可以有,爲什麼你的ListView是這麼長時間來加載一個想法。 – Nanoc
你可能會開創了每次調用getView適配器的視圖,可以考慮使用視圖持有人模式或RecyclerView –
@AlexGoja爲RecyclerView任何的例子嗎? –