更换的ListView行与其他布局的onClick [英] Replacing ListView row with another layout onClick
问题描述
我只TextView的一个ListView。我想这要是我点击一个ListView一行的执行情况,更换按钮一个EditText应该出现,无论我输入的EditText上,点击替换,该listrow应该更新。我面对的是充气名单上的布局我的主要问题row.Can有人告诉我如何实现这一目标?
公共类ContextMenuActivity延伸活动{
私人的ListView列表;
TextView的电视;
ArrayList的<字符串> alistItems;
INT loopCount;
CustomAdapter适配器;
LayoutInflater充气;
的TextView TextView的;
的EditText edtTextToReplace;
RelativeLayout的rl_inflate;
查看子女;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.contextmenulist);
的initComponents();
的setActionListener();
}
@覆盖
公共无效onCreateContextMenu(文本菜单菜单,视图V,
ContextMenuInfo menuInfo){
super.onCreateContextMenu(菜单,V,menuInfo);
menu.setHeaderTitle(「购股权」);
menu.add(0,v.getId(),0,编辑);
menu.add(0,v.getId(),0,删除);
/ *
* MenuInflater充气= getMenuInflater();
* inflater.inflate(R.menu.context_menu,菜单);
* /
}
私人无效的initComponents(){
充气= ContextMenuActivity.this.getLayoutInflater();
名单=(ListView控件)findViewById(R.id.contextmenu_lst_list);
电视=(TextView中)findViewById(R.id.listitem_txt_item);
alistItems =新的ArrayList<字符串>();
为(loopCount = 1; loopCount小于30; loopCount ++){
alistItems.add(项目+ loopCount);
}
prepareView();
}
私人无效prepareView(){
适配器=新CustomAdapter(getApplicationContext(),R.layout.listitem,
alistItems);
list.setAdapter(适配器);
registerForContextMenu(名单);
}
私人无效的setActionListener(){
list.setOnItemClickListener(新OnItemClickListener(){
@覆盖
公共无效onItemClick(适配器视图<>为arg0,最终的视图中查看,
最终诠释ARG2,长ARG3){
的System.out.println(ALIST为+ alistItems);
TextView的=(的TextView)view.findViewById(R.id.listitem_txt_item);
rl_inflate =(RelativeLayout的)查看
.findViewById(R.id.rl_inflate);
孩子= getLayoutInflater()。膨胀(R.layout.clicklistitem,
空值);
rl_inflate.addView(子);
textView.setVisibility(View.GONE);
rl_inflate.setVisibility(View.VISIBLE);
按钮将my_btn =(按钮)子
.findViewById(R.id.clicklistitem_btn_replace);
edtTextToReplace =(EditText上)子
.findViewById(R.id.clicklistitem_edt);
my_btn.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
textView.setText(edtTextToReplace.getText()的toString());
alistItems.set(ARG2,edtTextToReplace.getText()
的ToString());
rl_inflate.setVisibility(View.GONE);
rl_inflate.removeViewInLayout(子);
textView.setVisibility(View.VISIBLE);
adapter.notifyDataSetChanged();
}
});
}
});
}
公共类CustomAdapter扩展ArrayAdapter<字符串> {
ArrayList的<字符串> alistItems;
INT资源;
公共CustomAdapter(上下文的背景下,INT资源,
ArrayList的<字符串> alistItems){
超(背景下,资源);
this.alistItems = alistItems;
this.resource =资源;
}
@覆盖
公众诠释getCount将(){
返回alistItems.size();
}
@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
持有人440 =新的持有人();
如果(convertView == NULL){
convertView =气筒
.inflate(R.layout.listitem,父母,假);
}
holder.tvRow =(TextView中)convertView
.findViewById(R.id.listitem_txt_item);
convertView.setTag(保持器);
支架=(座)convertView.getTag();
holder.tvRow.setText(alistItems.get(位置));
返回convertView;
}
}
类持有人{
TextView的tvRow;
}
}
您可以通过两种方式实现这一目标: -
-
首先是在ListView的项目布局添加的EditText和一个按钮,并隐藏他们。现在设置列表视图的onItemClickListener其中隐藏的TextView并显示editext和替换按钮。
-
二是建立与编辑文本和一个按钮一个新的布局和设置onItemClickListener的列表视图和行点击时,你可以很容易地膨胀时,布局到你的列表视图的项目布局。
第二个解决方案code: -
inflate.xml 的
<的EditText
机器人:ID =@ + ID / enter_txt
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
/>
<按钮
机器人:ID =@ + ID / btn_replace
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
/>
* list_view_item.xml *
<的TextView
机器人:ID =@ + ID / my_txt发生
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
机器人:文本=ABCD
/>
< RelativeLayout的
机器人:ID =@ + ID / rl_inflate
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
/>
列表视图onItemClickListener 的
listView.setOnItemClickListener(新OnItemClickListener(){
@覆盖
公共无效onItemClick(适配器视图<>母公司视图中查看,
INT位置,长的id){
TextView的txt_view =(TextView中)view.findViewById(R.id.my_txt);
txt_view.setVisibility(View.GONE);
RelativeLayout的rl_inflate =(RelativeLayout的)view.findViewById(R.id.rl_inflate);
查看孩子= getLayoutInflater()膨胀(R.layout.inflate)。
rl_inflate.addView(子);
按钮将my_btn =(按钮)child.findViewById(R.id.btn_replace);
EditText上enter_txt =(EditText上)child.findViewById(R.id.enter_txt);
my_btn.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
txt_view.setText(enter_txt.getText()的toString());
txt_view.setVisibility(View.VISIBLE);
}
});
}
});
I have a ListView with only TextView. I want an implementation in which if I click on a ListView row, an edittext with a replace button should appear and whatever I type in that edittext and click replace, the listrow should update. My main problem which I face is inflating a layout on List row.Can anybody tell me how to achieve this?
public class ContextMenuActivity extends Activity {
private ListView list;
TextView tv;
ArrayList<String> alistItems;
int loopCount;
CustomAdapter adapter;
LayoutInflater inflater;
TextView textView;
EditText edtTextToReplace;
RelativeLayout rl_inflate;
View child;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contextmenulist);
initComponents();
setActionListener();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Options");
menu.add(0, v.getId(), 0, "Edit");
menu.add(0, v.getId(), 0, "Delete");
/*
* MenuInflater inflater = getMenuInflater();
* inflater.inflate(R.menu.context_menu, menu);
*/
}
private void initComponents() {
inflater = ContextMenuActivity.this.getLayoutInflater();
list = (ListView) findViewById(R.id.contextmenu_lst_list);
tv = (TextView) findViewById(R.id.listitem_txt_item);
alistItems = new ArrayList<String>();
for (loopCount = 1; loopCount < 30; loopCount++) {
alistItems.add("Item " + loopCount);
}
prepareView();
}
private void prepareView() {
adapter = new CustomAdapter(getApplicationContext(), R.layout.listitem,
alistItems);
list.setAdapter(adapter);
registerForContextMenu(list);
}
private void setActionListener() {
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, final View view,
final int arg2, long arg3) {
System.out.println("alist is " + alistItems);
textView = (TextView) view.findViewById(R.id.listitem_txt_item);
rl_inflate = (RelativeLayout) view
.findViewById(R.id.rl_inflate);
child = getLayoutInflater().inflate(R.layout.clicklistitem,
null);
rl_inflate.addView(child);
textView.setVisibility(View.GONE);
rl_inflate.setVisibility(View.VISIBLE);
Button my_btn = (Button) child
.findViewById(R.id.clicklistitem_btn_replace);
edtTextToReplace = (EditText) child
.findViewById(R.id.clicklistitem_edt);
my_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
textView.setText(edtTextToReplace.getText().toString());
alistItems.set(arg2, edtTextToReplace.getText()
.toString());
rl_inflate.setVisibility(View.GONE);
rl_inflate.removeViewInLayout(child);
textView.setVisibility(View.VISIBLE);
adapter.notifyDataSetChanged();
}
});
}
});
}
public class CustomAdapter extends ArrayAdapter<String> {
ArrayList<String> alistItems;
int resource;
public CustomAdapter(Context context, int resource,
ArrayList<String> alistItems) {
super(context, resource);
this.alistItems = alistItems;
this.resource = resource;
}
@Override
public int getCount() {
return alistItems.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder = new Holder();
if (convertView == null) {
convertView = inflater
.inflate(R.layout.listitem, parent, false);
}
holder.tvRow = (TextView) convertView
.findViewById(R.id.listitem_txt_item);
convertView.setTag(holder);
holder = (Holder) convertView.getTag();
holder.tvRow.setText(alistItems.get(position));
return convertView;
}
}
class Holder {
TextView tvRow;
}
}
You can achieve this in two ways :-
First is in listview's item layout add EditText and a Button and hide them. Now set onItemClickListener of listview in which hide textview and show editext and replace button.
Second is create a new layout with edit text and a button and set onItemClickListener for listview and when clicked on row you can easily inflate that layout into your listview's item layout.
Second Solution code:-
inflate.xml
<EditText
android:id="@+id/enter_txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btn_replace"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
*list_view_item.xml*
<TextView
android:id="@+id/my_txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ABCD"
/>
<RelativeLayout
android:id="@+id/rl_inflate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
listview onItemClickListener
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
TextView txt_view = (TextView)view.findViewById(R.id.my_txt);
txt_view.setVisibility(View.GONE);
RelativeLayout rl_inflate = (RelativeLayout)view.findViewById(R.id.rl_inflate);
View child = getLayoutInflater().inflate(R.layout.inflate);
rl_inflate.addView(child);
Button my_btn = (Button)child.findViewById(R.id.btn_replace);
EditText enter_txt = (EditText)child.findViewById(R.id.enter_txt);
my_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
txt_view.setText(enter_txt.getText().toString());
txt_view.setVisibility(View.VISIBLE);
}
});
}
});
这篇关于更换的ListView行与其他布局的onClick的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!