android - 将数据从两个字符串数组提取到两个不同的布局到单个列表视图中
问题描述
我已经看到了很多答案,并相应地更改了我的代码。现在我遇到了自己的问题。运行此适配器后,我从 list1 中获得一个值,而从 list2 中只有两个值,其中两个值都具有三个值。布局很好。我不知道是什么原因造成的,我我对arrayadapter也不是很熟悉。这将是一个很大的帮助。提前致谢。
public class AxisAdapter extends ArrayAdapter<String> {
private ArrayList<String> list1 = new ArrayList<String>();
private ArrayList<String> list2 = new ArrayList<String>();
private Context context;
private final int view1 = 0;
private final int view2 = 1;
public MyAdapter(Context context, ArrayList<String> records,ArrayList<String> records1) {
super(context, 0, records);
this.context = context;
list1=records;
list2=records1;
}
public int getViewTypeCount() {
return 2;
}
public int getItemViewType(int position) {
return (position == 0) ? view1 : view2;
}
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
int viewType = getItemViewType(position);
switch (viewType) {
case view1: {
final String item = list1.get(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.abc_layout, parent, false);
}
final TextView list_Txt = (TextView) convertView.findViewById(R.id.txtDef);
Button list_But = (Button) convertView.findViewById(R.id.btnCall);
list_Txt.setText(item.replaceAll("[^A-Za-z]", " "));
list_But.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String number = item.replaceAll("[A-Za-z]", "");
Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("tel:" + number));
context.startActivity(i);
}
});
}
break;
case view2: {
final String item = list2.get(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.url_layout, parent, false);
}
final TextView list_Txt = (TextView) convertView.findViewById(R.id.txtDetail);
Button list_But = (Button) convertView.findViewById(R.id.btnVisit);
list_Txt.setText(item.replaceAll("[^A-Za-z]", " "));
list_But.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String number = item.replaceAll("[A-Za-z]", "");
Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:12345"));
context.startActivity(i);
}
});
}
break;
}
return convertView;
}
}
在我的活动课上
public class AnActivity extends AppCompatActivity {
Toolbar toolbar;
AxisAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_axis);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if(getSupportActionBar()!= null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
ListView list = (ListView) findViewById(R.id.axisList);
String[] ussd = getResources().getStringArray(R.array.axisCode);
String[] links = getResources().getStringArray(R.array.axisLink);
ArrayList<String> myData = new ArrayList<String>();
ArrayList<String> myLinks = new ArrayList<String>();
for(int i = 0; i<ussd.length;i++) {
myData.add(ussd[i]);
}
for(int i =0;i<links.length;i++){
myLinks.add(links[i]);
}
adapter = new AxisAdapter(this,myData,myLinks);
list.setAdapter(adapter);
//adapter= new AxisAdapter(this,myLinks);
//list.setAdapter(adapter);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home)
finish();
return super.onOptionsItemSelected(item);
}
}
在我的两个布局类中,都有一个按钮和一个文本框。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="5dp"
android:background="@color/textboxColor">
<TextView
android:id="@+id/txtDef"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_marginLeft="2dp"
android:layout_weight="1"
android:fontFamily="@font/roboto_slab"
android:padding="5dp"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textSize="20sp" />
<Button
android:id="@+id/btnCall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="2dp"
android:layout_weight="0"
android:fontFamily="@font/roboto_slab_bold"
android:text="Call"
android:theme="@style/PrimaryButton" />
</LinearLayout>
</LinearLayout>
另一个:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="5dp"
android:background="@color/textboxColor">
<TextView
android:id="@+id/txtDetail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_marginLeft="2dp"
android:layout_weight="1"
android:fontFamily="@font/roboto_slab"
android:padding="5dp"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textSize="20sp" />
<Button
android:id="@+id/btnVisit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="2dp"
android:layout_weight="0"
android:fontFamily="@font/roboto_slab_bold"
android:text="Visit"
android:theme="@style/PrimaryButton" />
</LinearLayout>
</LinearLayout>
解决方案
你所关心的:
我从 list1 中得到一个值,而从 list2 中只有两个值,它们都有三个值
您面临的问题在于这些地方:
private final int view1 = 0;
private final int view2 = 1;
...
public int getItemViewType(int position) {
return (position == 0) ? view1 : view2;
}
然后在 getView() 方法中调用 getItemViewType 方法:
int viewType = getItemViewType(position);
position 的取值范围是从 0 到列表中的项目数减 1。因此 getItemViewType() 方法总是在 position = 0 时返回 0(view1),如果 position = 1、2、3,则返回 1(view2)。 ..
然后你写:
switch (viewType) {
case view1: {
final String item = list1.get(position);
...
}
break;
case view2: {
final String item = list2.get(position);
...
}
break;
}
在 中case view1
,它只是表示列表中位置 = 0 的第一项。只有 1 项停留在位置 0,因此final String item = list1.get(position);
只调用一次,这就是它返回 1 值的原因。
在 中case view2
,它只是表示位置 1、2、3 的项目...正如您所说的列表中有 3 个项目,适配器将为列表视图生成 3 个项目,case view2
并将等于位置 1 和 2。所以final String item = list2.get(position);
被调用了两次,这就是它返回 2 个值的原因。
我不知道你的下一步是什么,因为我不明白你的期望。
更新:具体解决方案:
public class AxisAdapter extends ArrayAdapter<String> {
private ArrayList<String> list1;
private ArrayList<String> list2;
private Context context;
public AxisAdapter(Context context, ArrayList<String> records,ArrayList<String> records1) {
super(context, 0);
this.context = context;
list1=records;
list2=records1;
}
@Override
public int getCount() {
return list1.size() + list2.size();
}
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
if (position < list1.size()) {
final String item = list1.get(position);
convertView = LayoutInflater.from(getContext()).inflate(R.layout.abc_layout, parent, false);
final TextView list_Txt = (TextView) convertView.findViewById(R.id.txtDef);
Button list_But = (Button) convertView.findViewById(R.id.btnCall);
list_Txt.setText(item.replaceAll("[A-Za-z]", ""));
list_But.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String number = item.replaceAll("[A-Za-z]", "");
Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("tel:" + number));
context.startActivity(i);
}
});
}
else {
final String item = list2.get(position - list1.size());
convertView = LayoutInflater.from(getContext()).inflate(R.layout.url_layout, parent, false);
final TextView list_Txt = (TextView) convertView.findViewById(R.id.txtDetail);
Button list_But = (Button) convertView.findViewById(R.id.btnVisit);
list_Txt.setText(item.replaceAll("[A-Za-z]", ""));
list_But.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String number = item.replaceAll("[A-Za-z]", "");
Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:12345"));
context.startActivity(i);
}
});
}
return convertView;
}
}
推荐阅读
- c# - 如何从我的 WebAPI 服务的 JSON 输出中删除回车?
- ruby-on-rails - 如何让 Rails 4 在自定义序列化程序上使用嵌套根序列化 ActiveModel JSON?
- javascript - 如何通过传递 TZ 格式来获取时区的 BCL 格式
- c - 为什么 scanf 只返回它已成功读取的输入数?
- jquery - 某些 PC 出现错误是加载资源失败:服务器响应状态为 414 (Request-URI Too Long)
- spring-security - 我们可以在编写自定义身份验证提供程序时添加密码编码器吗?
- java - java进程“无响应”的分析?
- hive - 使用分区创建 hive 外部表
- php - 如何在 CakePHP 3 中获取分页检索的记录总数?
- npm - 如何加快 webpack 开发