android listView中某一行的EditText禁止输入,该如何解决

「已注销」 2017-09-28 11:28:19
在开发过程中,项目需求在listView的表格中可以可以编辑修改数据,但是如果设置可以编辑,标题行也可以编辑,
如何设置标题行不可编辑但其他行可以编辑呢!


如图划横线所示,要求标题行不可被编辑,内容可编辑,但是出现的是整个列(包括标题行)都可以编辑,如何解决这个问题!求大牛解答!

自定义适配器(好像是这么说的,哈哈):
package com.liyu.nosfreight.Adapter;

import java.util.List;

public class TableAdapter extends BaseAdapter {

private List<Goods> list;
private LayoutInflater inflater;

public TableAdapter(Context context, List<Goods> list){
this.list = list;
inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
int ret = 0;
if(list!=null){
ret = list.size();
}
return ret;
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

Goods goods = (Goods) this.getItem(position);

ViewHolder viewHolder;

if(convertView == null){

viewHolder = new ViewHolder();

convertView = inflater.inflate(R.layout.list_route_item, null);
viewHolder.goodId = (TextView) convertView.findViewById(R.id.text_id);

viewHolder.goodName = (EditText) convertView.findViewById(R.id.text_goods_name);
viewHolder.goodCodeBar = (EditText) convertView.findViewById(R.id.text_codeBar);
viewHolder.goodNum = (EditText) convertView.findViewById(R.id.text_num);
viewHolder.goodCurrPrice = (EditText) convertView.findViewById(R.id.text_curPrice);
viewHolder.goodMoney = (EditText) convertView.findViewById(R.id.text_money);

convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}

viewHolder.goodId.setText(goods.getId());
viewHolder.goodId.setTextSize(13);
viewHolder.goodName.setText(goods.getGoodsName());
viewHolder.goodName.setTextSize(13);
viewHolder.goodCodeBar.setText(goods.getCodeBar());
viewHolder.goodCodeBar.setTextSize(13);
viewHolder.goodNum.setText(goods.getNum()+"");
viewHolder.goodNum.setTextSize(13);
viewHolder.goodCurrPrice.setText(goods.getCurPrice()+"");
viewHolder.goodCurrPrice.setTextSize(13);
viewHolder.goodMoney.setText(goods.getMoney()+"");
viewHolder.goodMoney.setTextSize(13);

return convertView;
}

public static class ViewHolder{
public TextView goodId;
public EditText goodName;
public EditText goodCodeBar;
public EditText goodNum;
public EditText goodCurrPrice;
public EditText goodMoney;
}
}

item布局代码:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >

<View
android:layout_width="1.5dp"
android:layout_height="fill_parent"
android:background="#000000"/>

<TextView
android:id="@+id/text_id"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:singleLine="true"
android:text="序号"
android:textColor="#000000"
android:textSize="15sp" />

<View
android:layout_width="1.5dp"
android:layout_height="fill_parent"
android:background="#000000"/>

<EditText
android:id="@+id/text_goods_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/table_input_bg"
android:layout_weight="3"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:textColor="#000000"
android:textSize="15sp"
android:singleLine="true"
android:gravity="center"
android:text="商品名称" />

<View
android:layout_width="1.5dp"
android:layout_height="fill_parent"
android:background="#000000"/>

<EditText
android:id="@+id/text_codeBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/table_input_bg"
android:layout_weight="2"
android:paddingBottom="10dp"
android:textColor="#000000"
android:paddingTop="10dp"
android:singleLine="true"
android:textSize="15sp"
android:gravity="center"
android:text="条形码" />

<View
android:layout_width="1.5dp"
android:layout_height="fill_parent"
android:background="#000000"/>

<EditText
android:id="@+id/text_num"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/table_input_bg"
android:layout_weight="1"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:textColor="#000000"
android:singleLine="true"
android:textSize="15sp"
android:gravity="center"
android:text="数量" />

<View
android:layout_width="1.5dp"
android:layout_height="fill_parent"
android:background="#000000"/>

<EditText
android:id="@+id/text_curPrice"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/table_input_bg"
android:layout_weight="1.5"
android:paddingBottom="10dp"
android:textColor="#000000"
android:textSize="15sp"
android:singleLine="true"
android:paddingTop="10dp"
android:gravity="center"
android:text="现价" />

<View
android:layout_width="1.5dp"
android:layout_height="fill_parent"
android:background="#000000"/>

<EditText
android:id="@+id/text_money"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/table_input_bg"
android:layout_weight="1.5"
android:paddingBottom="10dp"
android:singleLine="true"
android:textSize="15sp"
android:textColor="#000000"
android:paddingTop="10dp"
android:gravity="center"
android:text="金额" />

<View
android:layout_width="1.5dp"
android:layout_height="fill_parent"
android:background="#000000"/>
</LinearLayout>


主布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<View
android:layout_width="match_parent"
android:layout_height="1.5dp"
android:background="#000000"/>
<include
layout="@layout/list_route_item"
android:id="@+id/table_route_title" />

<View
android:layout_width="match_parent"
android:layout_height="1.5dp"
android:background="#000000"/>

<ListView
android:id="@+id/list"
android:divider="#000000"
android:dividerHeight="1.0dp"
android:scrollbars="none"
android:cacheColorHint="@android:color/transparent"
android:fadingEdge="none"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>

<View
android:layout_width="match_parent"
android:layout_height="1.5dp"
android:background="#000000"/>
</LinearLayout>

Activity代码:
package com.liyu.nosfreight;

public class RouteActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_route);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}

//设置表格标题的背景颜色
ViewGroup tableTitle = (ViewGroup) findViewById(R.id.table_route_title);
tableTitle.setBackgroundColor(Color.rgb(177, 173, 172));

List<Goods> list = new ArrayList<Goods>();
list.add(new Goods("1", "伊利婴儿加盖奶粉110ml", "982323423232", 34, 23, 23));
list.add(new Goods("2", "鱼翅", "31312323223", 34, 23, 23));
list.add(new Goods("3", "农夫山泉", "12", 34, 23, 23));
ListView tableListView = (ListView) findViewById(R.id.list);
TableAdapter adapter = new TableAdapter(this, list);
tableListView.setAdapter(adapter);
}

}

代码基本在这了,字数原因实体类就不写了,大牛们可以自写实体类运行试试,看看该如何解决这个问题呢!
...全文
542 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jklwan 2017-09-28
  • 打赏
  • 举报
回复
getView中进行设置是否可编辑。

if(position == 0){// 标题行,不可编辑
     viewHolder.goodId.setEnable(false);
     ...........
} else {
    viewHolder.goodId.setEnable(true);
}
判断是否标题行,当然可以修改成你的判断条件,如根据数据来,Goods加一个字段,是否可编辑,默认true,标题行数据设置为false。
「已注销」 2017-09-28
  • 打赏
  • 举报
回复
引用 8 楼 jklwan 的回复:
[quote=引用 7 楼 molixiangshi 的回复:]
这个方法放在哪里呢?
adapter.list.add()这个方法我怎么引用不了啊!

举例而已……下面的方法不是给你写出来了吗,放到adapter中,直接用就行了啊。效果就是添加一个数据,等同于adapter.list.add()。[/quote]
已经成功了,谢谢了!
在适配器类添加addData()这个方法,然后在Activity类中的新增按钮点击事件中引用:
    //新增按钮点击事件
public void insertBtnOnClick(){
Button insert = (Button) findViewById(R.id.route_insert);
insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
adapter.addData(new Goods("","","",0,0,0));
}
});
}

效果图:

感谢大神了!
「已注销」 2017-09-28
  • 打赏
  • 举报
回复
引用 6 楼 jklwan 的回复:
[quote=引用 5 楼 molixiangshi 的回复:] 怎么写才能在底下添加一行而不是变成只有一行呢!
更新数据源,你写的是直接替换了,adapter.list.add()//添加一行,可以在adapter中添加一个方法

public void addData(Goods goods){
    if(list == null){
        list = new ArrayList<>();
    }
    if(goods != null){
        list.add(goods);
    }
    notifyDataSetChanged();
}
[/quote] 这个方法放在哪里呢? adapter.list.add()这个方法我怎么引用不了啊!
jklwan 2017-09-28
  • 打赏
  • 举报
回复
引用 7 楼 molixiangshi 的回复:
这个方法放在哪里呢? adapter.list.add()这个方法我怎么引用不了啊!
举例而已……下面的方法不是给你写出来了吗,放到adapter中,直接用就行了啊。效果就是添加一个数据,等同于adapter.list.add()。
jklwan 2017-09-28
  • 打赏
  • 举报
回复
引用 5 楼 molixiangshi 的回复:
怎么写才能在底下添加一行而不是变成只有一行呢!
更新数据源,你写的是直接替换了,adapter.list.add()//添加一行,可以在adapter中添加一个方法

public void addData(Goods goods){
    if(list == null){
        list = new ArrayList<>();
    }
    if(goods != null){
        list.add(goods);
    }
    notifyDataSetChanged();
}
「已注销」 2017-09-28
  • 打赏
  • 举报
回复
引用 1 楼 jklwan 的回复:
getView中进行设置是否可编辑。

if(position == 0){// 标题行,不可编辑
viewHolder.goodId.setEnable(false);
...........
} else {
viewHolder.goodId.setEnable(true);
}

判断是否标题行,当然可以修改成你的判断条件,如根据数据来,Goods加一个字段,是否可编辑,默认true,标题行数据设置为false。


如图,点击新增按钮在底下添加一个空白行进行输入添加如何写呢!我这样写添加不了啊
    //新增按钮点击事件
public void insertBtnOnClick(){
Button insert = (Button) findViewById(R.id.route_insert);
insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<Goods> list = new ArrayList<Goods>();
list.add(new Goods(list.size()+1+"","","",0,0,0));
ListView tableListView = (ListView) findViewById(R.id.list);
TableAdapter adapter = new TableAdapter(RouteActivity.this, list);
tableListView.setAdapter(adapter);
}
});
}
会变成只有一行空白行

怎么写才能在底下添加一行而不是变成只有一行呢!
「已注销」 2017-09-28
  • 打赏
  • 举报
回复
引用 1 楼 jklwan 的回复:
getView中进行设置是否可编辑。

if(position == 0){// 标题行,不可编辑
     viewHolder.goodId.setEnable(false);
     ...........
} else {
    viewHolder.goodId.setEnable(true);
}
判断是否标题行,当然可以修改成你的判断条件,如根据数据来,Goods加一个字段,是否可编辑,默认true,标题行数据设置为false。
根据您的建议,我在EditText属性设置的时候把这个控件禁用了,然后判断position>=0把它启用就行了!因为position==0是第一行数据,判断position<0没有效果,我把解决详细方法写出来,给需要的来人参考参考! 属性设置:
        <EditText
            android:id="@+id/text_money"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="@drawable/table_input_bg"
            android:layout_weight="1.5"
            android:paddingBottom="10dp"
            android:singleLine="true"
            android:textSize="15sp"
            android:textColor="#000000"
            android:paddingTop="10dp"
            android:gravity="center"
            android:enabled="false"
            android:text="金额" />
判断position是否>=0:
            if(position >= 0) {
                viewHolder.goodId.setEnabled(true);
            }
寒冰大神 2017-09-28
  • 打赏
  • 举报
回复
其实 标题行单独用一个布局写 当做ListView头布局更好,你标题行和内容行总该有点区别才好吧
Jing丶無雙 2017-09-28
  • 打赏
  • 举报
回复
你把你的标题行单独用一个布局写不行么,一定要用ListView来绘制

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧