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);
        }
    }
原文地址:https://www.cnblogs.com/android-yus/p/5066464.html