[英]Change Activity's EditText from within an Adapter -> CustomView
基本上,我有這樣的結構:
活動-> RecyclerView適配器->自定義視圖
下面是我的代碼(為了簡化起見,我省略了一些部分)。
這是我的活動MainActivity.java:
public class MainActivity extends AppCompatActivity {
private final String TAG = "MainActivity";
private EditText textField;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
}
textField = (EditText) findViewById(R.id.textField);
// Adapter code
}
}
這是我的適配器MyAdapter.java:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private static final String TAG = "MyAdapter";
private Context context;
public MyAdapter(Context context) {
this.context = context;
}
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View v) {
super(v);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
CustomView customView = new CustomView(context);
ViewHolder viewHolder = new ViewHolder(customView);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
//
}
}
這是我的自定義視圖CustomView.java:
public class CustomView extends RelativeLayout {
private final String TAG = "CustomView";
private RelativeLayout mLayout;
private ImageView mPicture;
public CustomView(Context context) {
super(context);
init();
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
inflate(getContext(), R.layout.item_layout, this);
this.mLayout = (RelativeLayout) findViewById(R.id.layout);
this.mPicture = (ImageView) findViewById(R.id.picture);
mPicture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// change text of EditText in Activity here
}
});
}
}
我想要做的是,如果用戶單擊“自定義視圖”中的mPicture
,則應將“活動”中EditText的文本更改為“ Hello,world!”。
我怎樣才能做到這一點?
添加接口。
public class CustomView extends RelativeLayout {
public interface PictureClickListener {
public void onPictureClick();
}
private PictureClickListener listener;
public setPictureClickListener(PictureClickListener listener) {
this.listener = listener
}
...
mPicture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (CustomView.this.listener != null)
CustomView.this.listener.onPictureClick();
}
});
設置並實現接口
public class MainActivity extends AppCompatActivity
implements PictureClickListener {
@Override public void onPictureClick() {
// change text of EditText in Activity here
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Apapter code
adapter.setPictureClickListener(MainActivity.this);
}
注意:如果沒有CustomView
這會容易CustomView
...只需使ViewHolder
膨脹R.layout.item_layout
並將接口移到那里即可。
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(....); // here
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.mPicture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (MyAdapter.this.listener != null)
MyAdapter.this.listener.onPictureClick();
}
});
}
首先,您可以在onCreateViewHolder
方法中CustomView
自定義視圖,而不是創建CustomView
類。 對於這個問題,我的解決方案是將適配器更改為abstract class
並在適配器內部創建新的abstract
方法。 您要做的就是override
活動中的abstract
方法。
//change adapter to abstract class
public abstract class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private static final String TAG = "MyAdapter";
List<String> list = new ArrayList<>(); //your data
private Context context;
public MyAdapter(Context context) {
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View customView = inflater.inflate(R.layout.item_layout, parent, false); //inflate the custom view
ViewHolder viewHolder = new ViewHolder(customView);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
ViewHolder body = (ViewHolder) holder;
body.populateView(); //you can also pass some parameters here
}
@Override
public int getItemCount() {
return list.size(); //size of your array
}
public class ViewHolder extends RecyclerView.ViewHolder {
private RelativeLayout mLayout;
private ImageView mPicture;
public ViewHolder(View v) {
super(v);
this.mLayout = (RelativeLayout) v.findViewById(R.id.layout);
this.mPicture = (ImageView) v.findViewById(R.id.picture);
}
public void populateView(){
//set click listener to the picture
this.mPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onPictureClick(); // call the abstract method
}
});
}
}
//create new abstract method
public abstract void onPictureClick();
}
在您的活動(或片段)中:
MyAdapter adapter = new MyAdapter(getApplicationContext()) {
@Override
public void onPictureClick() { //override the abstract method
//change edittext value here
textField.setText("Hello World");
}
};
將您的textField從private更改為:
public static EditText textField;
在您的CustomView中,您現在應該可以setText了:
mPicture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.textField.setText("Hello World");
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.