《android编程权威指南》RecyclerView的notifyItemChanged()方法使用

这篇博客详细介绍了如何在Android中使用RecyclerView.Adapter的notifyItemChanged(int position)方法来刷新列表中的单个条目。内容包括理解方法参数、利用getPosition()获取列表项位置、在CrimeAdapter或CrimeHolder类中实现功能,以及在onClick()中更新position值。同时提出了通过crime项ID确定列表位置的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先要使用RecyclerView.Adapter的notifyItemChanged(int)方法实现只需要刷新列表项中的单个crime项。
2、需要知道该方法中的参数(int position),
3、在RecyclerView中有个getPosition()函数,可以获取该项的在给定列表中的位置。
	/**
 	* Returns the adapter position of the item represented by the given View. This does not
 	* contain any adapter changes that might have happened after the last layout.
 	*
 	* @param view The view to query
	 * @return The adapter position of the item which is rendered by this View.
	 */
	public int getPosition(View view) {
 	   return ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
	}
4、可以把该函数放在CrimeAdapter类中也可以放在CrimeHolder类中。
5、只有在用户点击某个crime项时,程序才知道位置,所以应该在onClick()方法中给全局变量position 赋值。
6、最后在updeUI()函数中使用position即可。

P.S.
可以尝试通过crime项的Id来确定点击的crime项在list列表中的索引位置。
不知道是否可行。

//CimeListFragment.java
package com.example.*****.criminalintent;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

/**
 * Created by ***** on 2017/4/27.
 */

public class CrimeListFragment extends Fragment {
    private RecyclerView mCrimeRecyclerView;
    private CrimeAdapter mAdapter;
    private int position;//设置列表项位置的全局变量
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState){
        View view = inflater.inflate(R.layout.fragment_crime_list, container, false);
        mCrimeRecyclerView = (RecyclerView)view
                .findViewById(R.id.crime_recycler_view);
        mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        updateUI();

        return view;
    }

    @Override
    public void onResume(){
        super.onResume();
        updateUI();
    }

    private void updateUI(){
        CrimeLab crimeLab = CrimeLab.get(getActivity());
        List<Crime> crimes = crimeLab.getCrimes();

        if (mAdapter ==null){
            mAdapter = new CrimeAdapter(crimes);
            mCrimeRecyclerView.setAdapter(mAdapter);
        }else{

            mAdapter.notifyItemChanged(position); //更新视图函数中采用notifyItemChanged(int)方法。
        }


    }

    private class CrimeHolder extends RecyclerView.ViewHolder
                implements View.OnClickListener{

        private Crime mCrime;

        private TextView mTitleTextView;
        private TextView mDateTextView;
        private CheckBox mSolvedCheckBox;

        public CrimeHolder(View itemView){
            super(itemView);
            itemView.setOnClickListener(this);
            mTitleTextView = (TextView) itemView
                    .findViewById(R.id.list_item_crime_title_text_view);
            mDateTextView = (TextView)
                    itemView.findViewById(R.id.list_item_crime_date_text_view);
            mSolvedCheckBox = (CheckBox)
                    itemView.findViewById(R.id.list_crime_solved_check_box);
        }

        public void bindCrime(Crime crime){
            mCrime = crime;
            mTitleTextView.setText(mCrime.getTitle());
            mDateTextView.setText(mCrime.getDate().toString());
            mSolvedCheckBox.setChecked(mCrime.isSovled());
        }
        @Override
        public void onClick(View v){
           Intent intent = CrimeActivity.newIntent(getActivity(), mCrime.getId());
            position = getPosition(v);  //在点击列表中某一项的同时获取该项在列表中的位置。
            startActivity(intent);
        }
	//该函数可以在RecyclerView的源代码中获取,只需复制粘贴就可以用了。
        public int getPosition(View view) {
            return ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
        }
    }

    private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder>{
        private List<Crime> mCrimes;

        public CrimeAdapter(List<Crime> crimes){
            mCrimes = crimes;
        }
        @Override
        public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType){
            LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
            View view = layoutInflater
                    .inflate(R.layout.list_item_crime, parent, false);
            return new CrimeHolder(view);
        }

        @Override
        public void onBindViewHolder(CrimeHolder holder, int position){
            Crime crime = mCrimes.get(position);
            holder.bindCrime(crime);
        }

        @Override
        public int getItemCount(){
            return mCrimes.size();
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值