1、寫在前面
實(shí)現(xiàn)一個(gè)聊天界面,就是類似QQ那種,這里是講一下倒序排列,不實(shí)現(xiàn)QQ的各種高級(jí)功能
2、ListView 反轉(zhuǎn)數(shù)據(jù)
只要把數(shù)據(jù)倒序加入到adapter的數(shù)據(jù)集中,就可以實(shí)現(xiàn)倒序效果
/**
* 回底部
*/
public void goBottom() {
handler.post(new Runnable() {
@Override
public void run() {
if (mListView != null)
mListView.setSelection(mListView.getBottom());
}
});
}
這個(gè)方案有一下幾個(gè)問(wèn)題
- 顯示最后一條需要每次都移動(dòng)到相應(yīng)位置
- 加載更多需要使用下拉刷新的樣式實(shí)現(xiàn)(如果樣式差不多,這里不是問(wèn)題)
3、RecyclerView
方案一、反轉(zhuǎn)數(shù)據(jù)
同listview的實(shí)現(xiàn)方式,將數(shù)據(jù)倒序加入,除了具有l(wèi)istview方式的問(wèn)題
方案二、反轉(zhuǎn)列表
RecyclerView的布局是有LayoutManager控制的,LinearLayoutManager就支持了倒序的功能
1. setStackFromEnd(true)
2. setReverseLayout(true)
3. list.addFirst(item)
在數(shù)據(jù)上,可以考慮使用上面3的方法,直接添加數(shù)據(jù)到列表的頭部,或者重寫adapter的getItem方法,改為get(size-1-position)
ps:這里有勿,直接添加數(shù)據(jù)即可,不需要加到前面。
RecyclerView rv = (RecyclerView) findViewById(R.id.rv);
LinearLayoutManager layout = new LinearLayoutManager(this);
layout.setStackFromEnd(true);//列表再底部開(kāi)始展示,反轉(zhuǎn)后由上面開(kāi)始展示
layout.setReverseLayout(true);//列表翻轉(zhuǎn)
rv.setLayoutManager(layout);
final SimpleRvAdapter adapter = new SimpleRvAdapter(this);
rv.setAdapter(adapter);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
adapter.add(String.valueOf(adapter.getItemCount() + 1));
adapter.notifyDataSetChanged();
}
});
public class SimpleRvAdapter extends RecyclerView.Adapter<SimpleRvAdapter.VH> {
private Context mContext;
private LinkedList<String> list = new LinkedList<>();
public SimpleRvAdapter(Context context) {
mContext = context;
}
// public void add(String item) {
// list.addFirst(item);
// }
@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);
return new VH(view);
}
@Override
public void onBindViewHolder(VH holder, final int position) {
holder.textView.setText(list.get(position));
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "position:" + position, Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public static class VH extends RecyclerView.ViewHolder {
private TextView textView;
public VH(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
}
}
}
這樣就實(shí)現(xiàn)了我們需要的功能,這時(shí)候,列表使反轉(zhuǎn)的,bottom在上面,其他的功能正常使用,比如,加載更多自動(dòng)會(huì)跑到上面去
如果在需求上有出入,可以根據(jù)需求自定義LayoutManager,這也就是RecyclerView的強(qiáng)大之處,,完全由你自定義的布局