簡體   English   中英

從適配器-> CustomView中更改Activity的EditText

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM