如何在TextView上显示“自动滚动RecyclerView”位置?

时间:2019-05-26 13:47:29

标签: java android android-recyclerview

我正在做一个自动滚动图像的应用程序,在屏幕底部有一个静态布局,我需要显示已经通过的图像的值(即位置)。

我通过实现获得了传递的图像的正确值:     int position = holder.getAdapterPosition(); 在RecyclerViewListAdapter.java中 现在我需要在RecyclerViewListActivity.java中显示此值 在“回收者”视图下静态布局的文本视图上?

公共类RecyclerViewListAdapter扩展了RecyclerView.Adapter {

Context context;
List<Data> dataList;
private SharedPreferences preferences;

public RecyclerViewListAdapter(Context context, List<Data> dataList) {
    this.context = context;
    this.dataList = dataList;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_recycler_list, parent, false);
    return new MyViewHolder(itemView);
}

@Override

public void onBindViewHolder(final MyViewHolder holder,  final int position) {
    holder.mImage.setImageResource(dataList.get(position).getImage());
    holder.mImage.setImageResource(dataList.get(position).getImage());

    **int position = holder.getAdapterPosition();**

}


@Override
public int getItemCount() {

    if (dataList == null || dataList.size() == 0)
        return 0;
    return dataList.size();
}

public class MyViewHolder extends RecyclerView.ViewHolder {

    TextView mNumberText,mText;
    ImageView mImage;
    LinearLayout mLinearLayout;

    public MyViewHolder(View itemView) {
        super(itemView);
        mImage = (ImageView) itemView.findViewById(R.id.quran_page);
        mLinearLayout = (LinearLayout) itemView.findViewById(R.id.linearLayout);

    }
}

}


公共类RecyclerViewListActivity扩展了AppCompatActivity {

RecyclerView mListRecyclerView;
ArrayList<Data> dataArrayList;
RecyclerViewListAdapter recyclerViewListAdapter ;

Runnable updater;

private boolean isTouch = false;

TextViewRemaining;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_recycler_view_list);

    final TextView TextViewRemaining = (TextView) findViewById(R.id.TextViewRemaining);


    **TextViewRemaining.setText("Position: "+position);**

    initializeView();

    mListRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(this,
            mListRecyclerView, new ClickListener() {
        @Override
        public void onClick(View view, int position) {

       }

        @Override
        public void onLongClick(View view, int position) {
            Toast.makeText(RecyclerViewListActivity.this, "Long press on position :" + position,
                    Toast.LENGTH_LONG).show();
           }
    }));
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
            return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    return super.onOptionsItemSelected(item);
}


public static interface ClickListener{
    public void onClick(View view,int position);
    public void onLongClick(View view,int position);
}


class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{

    private ClickListener clicklistener;
    private GestureDetector gestureDetector;

    //@RequiresApi(api = Build.VERSION_CODES.CUPCAKE)
    public RecyclerTouchListener(Context context, final RecyclerView recycleView, final ClickListener clicklistener){

        this.clicklistener=clicklistener;
        gestureDetector=new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child=recycleView.findChildViewUnder(e.getX(),e.getY());
                if(child!=null && clicklistener!=null){
                    clicklistener.onLongClick(child,recycleView.getChildAdapterPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        View child=rv.findChildViewUnder(e.getX(),e.getY());
        if(child!=null && clicklistener!=null && gestureDetector.onTouchEvent(e)){
            clicklistener.onClick(child,rv.getChildAdapterPosition(child));
        }

        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}



private void initializeView()
{

    mListRecyclerView = (RecyclerView) findViewById(R.id.vR_recyclerViewList);

    setValues();
}



private void setValues(){
    prepareData();

    recyclerViewListAdapter = new RecyclerViewListAdapter(RecyclerViewListActivity.this,dataArrayList);
    mListRecyclerView.setLayoutManager(new LinearLayoutManager(RecyclerViewListActivity.this)); // original
    mListRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mListRecyclerView.setHasFixedSize(false);

    mListRecyclerView.setAdapter(recyclerViewListAdapter);
    recyclerViewListAdapter.notifyDataSetChanged();

    final int speedScroll = 2000; //default is 2000 it need to be 30000
    final Handler handler = new Handler();
    final Runnable runnable = new Runnable() {

        int count = 0;
        // boolean flag = true;
        @Override
        public void run() {

            boolean x=true;
            //  while(x) {
            if (count < recyclerViewListAdapter.getItemCount()) {
                if (count == recyclerViewListAdapter.getItemCount() - 1) {
                    flag = false;
                } else if (count == 0) {
                    flag = true;
                }


            }
            if (flag) count++;
            // else count--;

            mListRecyclerView.smoothScrollToPosition(count);


            handler.postDelayed(this, speedScroll);

        }

    };

    handler.postDelayed(runnable,speedScroll);

}


private void prepareData(){
    dataArrayList = new ArrayList<>();

    Data data1 = new Data();
    data1.setImage(R.drawable.p1);
    dataArrayList.add(data1);

    Data data2 = new Data();
    data2.setImage(R.drawable.p2);
    dataArrayList.add(data2);

    Data data3 = new Data();
    data3.setImage(R.drawable.p3);
    dataArrayList.add(data3);

    Data data4 = new Data();
    data4.setImage(R.drawable.p4);
    dataArrayList.add(data4);

    Data data5 = new Data();
    data5.setImage(R.drawable.p5);
    dataArrayList.add(data5);


}

}

因此,由于位置是动态值,我如何实时在textView上显示位置值,我希望textView的输出随着图像传递到顶部而改变。

非常感谢。

1 个答案:

答案 0 :(得分:0)

这是我解决问题的方法: 我将位置值保存在幂首选项(共享首选项的更简单版本)中,这非常感谢: 阿里·阿萨迪(https://android.jlelse.eu/powerpreference-a-simple-approach-to-store-data-in-android-a2dad4ddc4ac) 我使用一个线程,它每秒钟更新一次textview,这要归功于: https://www.youtube.com/watch?v=6sBqeoioCHE&t=149s 谢谢大家。