ListView使用的时候遇到的一些问题
昨天在做项目时,请求服务器的好友动态后,将好友动态和评论显示到界面上,用ListView显示,发现一进这个界面时,listView的适配器的getVIew()方法就会执行6次,后来发现原来是ListView的宽高写的有问题,开始写的是宽为match_parent,高为包裹内容,这样就出现了问题,之后把ListView的宽高都改为了match_parent,getView()方法就正常执行了,界面布局改为了这样:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingStart="5dp" android:paddingEnd="5dp" android:background="@color/base_background_color"> <ListView android:id="@+id/lv_fragment_friends" android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" android:divider="@android:color/transparent" android:dividerHeight="10dp" android:paddingBottom="10dp" android:scrollbarStyle="outsideOverlay"> </ListView> </LinearLayout>
然后我要把分享信息的评论动态用代码添加到ListView的每个item里面,item布局如下:
部分代码:
//messageFragment的二级fragment
public class Message_Friends_Fragment extends Fragment { /** * 自定义的观察者 */ public MyObserver mObserver; /** * 从服务器获取的所有的好友分享的动态的集合 */ private List<Resquest_friends_info.EveryShareInfo> mResults_list; /** * ListVIew当前的条目 */ public static int CURRENT_ITEM = 0; @Bind(R.id.lv_fragment_friends) ListView mListView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_message_firends, null);//ViewGroup ? ButterKnife.bind(this, view); mObserver = new MyObserver();//创建一个观察者对象 //创建一个访问网络的Control Message_Friends_NetControl control = new Message_Friends_NetControl(this); control.getFriendsShareFromServer();//访问网络并且解析Json mListView.setDivider(null); return view; } class FrendsAdapter extends BaseAdapter { @Override public int getCount() { return mResults_list.size(); } @Override public Object getItem(int i) { return mResults_list.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { Log.d("msg", "getView()"); ViewHolder holder; if (convertView != null) { holder = (ViewHolder) convertView.getTag(); } else { convertView = View.inflate(UIUtils.getContext(), R.layout.lv_item_message_friends, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } //获取某条分享的动态 Resquest_friends_info.EveryShareInfo info = mResults_list.get(i); // Log.d("msg","现在是第几个动态?"+"--->"+i); //获取当前分享动态的所有回复的集合 ArrayList<Resquest_friends_info.EveryShareInfo.Reply> replys = info.getPub_com(); // Log.d("msg","评论总数--->"+replys.size()); for (Resquest_friends_info.EveryShareInfo.Reply reply : replys) { Log.d("msg",reply.getPc_txt()+"--->"+reply.getPc_name());//评论的内容以及顺序全是正确的 } Log.d("msg", "第几个条目?++------------------------------------------------" + i); //动态添加评论之前先移除评论线性布局里的所有评论,因为这个线性布局可能是复用的之前item的,所以要先移除线性布局里原来的评论 holder.ll_comment_message_friends.removeAllViews(); for(int j=0;j<replys.size();j++){ TextView textView = new TextView(UIUtils.getContext());//new 一条评论 textView.setText(replys.get(j).getPc_name()+": "+replys.get(j).getPc_txt());//设置评论人的名字和评论的内容 textView.setTextColor(Color.BLACK); holder.ll_comment_message_friends.addView(textView); } holder.tvUserName.setText(info.getPub_frd_name());//设置好友动态分享者的名字 Log.d("msg","tvUserName是否同一对象?---->"+holder.tvUserName.toString()); holder.tvTime.setText(info.getPub_datetime());//设置分享这条动态的时间 holder.tvSaySth.setText(info.getPub_context());//设置分享动态的内容 //显示用户头像 ImageLoader.getInstance().displayImage(GlobalConstant.SERVER_URL + "/" + info.getPub_frd_head(), holder.ivUserFace); return convertView; } } //holder里面的对象,每个item都是这个对象,只不过内容不同 static class ViewHolder { @Bind(R.id.iv_friends_face) ImageView ivUserFace;//用户头像 @Bind(R.id.tv_user_name) TextView tvUserName;//用户名字 @Bind(R.id.tvTime_friends) TextView tvTime;//时间 @Bind(R.id.tvSaySth) TextView tvSaySth;//说点什么 @Bind(R.id.iv_friends_friends_pic) ImageView iv_friends_friends_pic;//发的具体图片 /** * 用来放评论的线性布局 */ @Bind(R.id.ll_comment_message_friends) LinearLayout ll_comment_message_friends; public ViewHolder(View view) { ButterKnife.bind(this, view); } }