Java 更改RecyclerView中的特定元素

Java 更改RecyclerView中的特定元素,java,android,android-recyclerview,Java,Android,Android Recyclerview,我对Android的新回收视图有点麻烦。我想创建一个设置活动,每个选项都作为CardView。在每个CardView中有两个文本视图,一个标题和一个副标题。目标是当用户单击特定的CardView时,我希望能够更改该CardView的字幕文本。我的问题是,当我尝试使用下面的代码时,它不会这样做 TextView subTitle = (TextView) findViewById(R.id.subTitle); subTitle.setText("Blah Blah Blah"); 当我点击第一

我对Android的新回收视图有点麻烦。我想创建一个设置活动,每个选项都作为CardView。在每个CardView中有两个文本视图,一个标题和一个副标题。目标是当用户单击特定的CardView时,我希望能够更改该CardView的字幕文本。我的问题是,当我尝试使用下面的代码时,它不会这样做

TextView subTitle = (TextView) findViewById(R.id.subTitle);
subTitle.setText("Blah Blah Blah");
当我点击第一个CardView时,它的变化非常好。问题是当我点击第二个时:它会用第二个文本更改第一个

我听说在调用onBindViewHolder方法时为每个TextView分配一个自定义ID,这样我就可以

TextView subTitle = (TextView) findViewById(R.*something*.subtitle1);
subTitle.setText("Blah Blah Blah");
这是正确的行动方针吗?如果是,我将如何着手

以下是我目前的代码:

OptionsAdapter.java

package com.alexbeschler.reversepolishnotation;

import android.graphics.Typeface;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

public class OptionsAdapter extends RecyclerView.Adapter<OptionsAdapter.OptionsViewHolder> {
    private List<Option> optionList;
    private onItemClicked mOnItemClickListener;

    public OptionsAdapter(List<Option> optionList) {
        this.optionList = optionList;
    }

    @Override
    public OptionsViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.options_card_view, viewGroup, false);
        return new OptionsViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(OptionsViewHolder holder, int position) {
        Option option = optionList.get(position);
        holder.title.setText(option.title);
        holder.subTitle.setText(option.subTitle);
    }

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

    class OptionsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView title, subTitle;

        public OptionsViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.title);
            title.setTypeface(null, Typeface.BOLD);
            subTitle = (TextView) itemView.findViewById(R.id.subTitle);
            subTitle.setTypeface(null, Typeface.ITALIC);
            itemView.setClickable(true);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                mOnItemClickListener.onItemClick(v, getAdapterPosition());
            }
        }
    }

    public interface onItemClicked {
        void onItemClick(View view, int position);
    }

    public void setOnItemClickListener(onItemClicked mOnItemClickListener) {
        this.mOnItemClickListener = mOnItemClickListener;
    }
}
package com.alexbeschler.reversepolishnotation;
导入android.graphics.Typeface;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入java.util.List;
公共类选项适配器扩展了RecyclerView.Adapter{
私人列表选择列表;
私有的单击监视器ClickListener;
公共选项适配器(列表选项列表){
this.optionList=optionList;
}
@凌驾
公共选项ViewHolder onCreateViewHolder(视图组视图组,int i){
View itemView=LayoutFlater.from(viewGroup.getContext())。充气(R.layout.options\u card\u视图,viewGroup,false);
返回新选项ViewHolder(itemView);
}
@凌驾
BindViewHolder上的公共无效(选项ViewHolder,int位置){
Option=optionList.get(位置);
holder.title.setText(选项.title);
holder.subTitle.setText(选项.subTitle);
}
@凌驾
public int getItemCount(){
返回optionList.size();
}
类选项ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
公共文本查看标题、副标题;
公共选项ViewHolder(查看项目视图){
超级(项目视图);
title=(TextView)itemView.findViewById(R.id.title);
title.setTypeface(null,Typeface.BOLD);
subTitle=(TextView)itemView.findViewById(R.id.subTitle);
subTitle.setTypeface(null,Typeface.ITALIC);
itemView.setClickable(真);
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图v){
如果(MonitorClickListener!=null){
mOnItemClickListener.onItemClick(v,getAdapterPosition());
}
}
}
已单击公共接口{
void onItemClick(视图,int位置);
}
public void setOnItemClickListener(OnItemClickListener监视器){
this.mOnItemClickListener=mOnItemClickListener;
}
}
OptionsActivity.java

package com.alexbeschler.reversepolishnotation;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class OptionsActivity extends AppCompatActivity {
    private final String OPTIONS_FILE_NAME = "reversepolishnotation_options";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_options);

        //Instantiate the toolbar
        Toolbar toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        //Instantiate the RecyclerView
        RecyclerView optionsList = (RecyclerView) findViewById(R.id.cardList);
        optionsList.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        optionsList.setLayoutManager(linearLayoutManager);

        final OptionsAdapter optionsAdapter = new OptionsAdapter(createOptionsList());
        optionsList.setAdapter(optionsAdapter);
        optionsAdapter.setOnItemClickListener(new OptionsAdapter.onItemClicked() {
            @Override
            public void onItemClick(View view, int position) {
                optionsListener(position);
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home) {
            NavUtils.navigateUpFromSameTask(this);
        }
        return super.onOptionsItemSelected(item);
    }

    private List<Option> createOptionsList() {
        List<Option> list = new ArrayList<>();
        Option option1 = new Option(); 
        Option option2 = new Option();

        option1.title = "Integer Type";
        option1.subTitle = "Specifies what type of integer to use - " +
                readString("KEY_INTEGER_TYPE", "Double");
        list.add(option1);

        option2.title = "Rounding Mode";
        option2.subTitle = "Specifies how to round; only available in BigDecimal - " +
                readString("KEY_ROUNDING_MODE", "Half Up");
        list.add(option2);

        return list;
    }

    private void optionsListener(int position) {
        switch (position) {
            case 0:
                //Set the first CardView's subTitle text to something different
                break;
            case 1:
                //Set the second CardView's subTitle text to something different
                break;
            default:
        }
    }

    private String readString(String optionName, String defaultValue) {
        SharedPreferences sharedPreferences = this.getSharedPreferences(OPTIONS_FILE_NAME,
                Context.MODE_PRIVATE);
        return sharedPreferences.getString(optionName, defaultValue);
    }

    private void writeString(String optionName, String optionValue) {
        SharedPreferences sharedPreferences = this.getSharedPreferences(OPTIONS_FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(optionName, optionValue);
        editor.apply();
    }
}
package com.alexbeschler.reversepolishnotation;
导入android.content.Context;
导入android.content.SharedReferences;
导入android.os.Bundle;
导入android.support.v4.app.NavUtils;
导入android.support.v7.app.AppActivity;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.support.v7.widget.Toolbar;
导入android.view.MenuItem;
导入android.view.view;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.List;
公共类选项活动扩展了AppCompatActivity{
私有最终字符串选项\u文件\u NAME=“reversepolishnotation\u选项”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_选项);
//实例化工具栏
Toolbar Toolbar=(Toolbar)findViewById(R.id.app_bar);
设置支持操作栏(工具栏);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//实例化RecyclerView
RecyclerView选项列表=(RecyclerView)findViewById(R.id.cardList);
optionsList.setHasFixedSize(true);
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(此);
linearLayoutManager.setOrientation(linearLayoutManager.VERTICAL);
选项列表。setLayoutManager(linearLayoutManager);
最终选项适配器选项适配器=新选项适配器(createOptionsList());
选项列表。设置适配器(选项适配器);
optionAdapter.setOnItemClickListener(新的optionAdapter.onItemClicked(){
@凌驾
公共虚线单击(视图,int位置){
选项监听器(位置);
}
});
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==android.R.id.home){
NavUtils.navigateUpFromSameTask(本);
}
返回super.onOptionsItemSelected(项目);
}
私有列表CreateOptions列表(){
列表=新的ArrayList();
选项1=新选项();
选项2=新选项();
option1.title=“整型”;
option1.subTitle=“指定要使用的整数类型—+
readString(“KEY\u INTEGER\u TYPE”、“Double”);
列表。添加(选项1);
选项2.title=“四舍五入模式”;
option2.subTitle=“指定如何四舍五入;仅适用于BigDecimal-”+
readString(“键四舍五入模式”、“上半”);
列表。添加(选项2);
退货清单;
}
私有void选项侦听器(int位置){
开关(位置){
案例0:
//将第一个CardView的字幕文本设置为其他内容
打破
案例1:
//将第二个CardView的字幕文本设置为其他内容
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.alexbeschler.reversepolishnotation.OptionsActivity">

    <include
        android:id="@+id/app_bar"
        layout="@layout/app_bar" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/cardList"
        android:layout_below="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/app_bar"
    android:layout_marginLeft="@dimen/padding15dp"
    android:layout_marginRight="@dimen/padding15dp"
    android:layout_marginTop="@dimen/padding15dp"
    android:clickable="true"
    android:foreground="?android:attr/selectableItemBackground"
    card_view:cardCornerRadius="2dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="@dimen/padding10dp">

        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello_world"
            android:textSize="17sp" />

        <TextView
            android:id="@+id/subTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello_world"
            android:textSize="14sp" />

    </LinearLayout>
</android.support.v7.widget.CardView>