我知道ListAdapter是一个接口而ArrayAdapter是一个类.所以我们只能实例化ArrayAdapter.我遇到了一个代码
ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, songNames);
Run Code Online (Sandbox Code Playgroud)
但我能够做同样的事情
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, songsArray);
Run Code Online (Sandbox Code Playgroud)
所以我想知道,在什么地方我们需要ListAdapter?
谢谢
我有这个项目结构的ArrayAdapter:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout ... >
<TextView
android:id="@+id/itemTextView"
... />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
并添加此适配器,以便:
mAdapter = new ArrayAdapter<String>(this, R.layout.item,
R.id.itemTextView, itemsText);
Run Code Online (Sandbox Code Playgroud)
一切都很好,但我想更新适配器项目中的文本.我找到了解决方案
mAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
但不明白如何使用它.请帮忙.
UPD 我的代码:
String[] itemsText = {"123", "345", "567"};
ArrayAdapter<String> mAdapter;
Run Code Online (Sandbox Code Playgroud)
的onCreate
mAdapter = new ArrayAdapter<String>(this, R.layout.roomitem,
R.id.itemTextView, itemsText);
setListAdapter(mAdapter);
itemsText = {"789", "910", "1011"};
Run Code Online (Sandbox Code Playgroud)
的onClick
mAdapter.notifyDataSetChanged();
//it's dont work
Run Code Online (Sandbox Code Playgroud) 我有一个可以由用户更新的列表,但是notifyDataSetChanged()没有与该关联的适配器一起工作listView.我在一个片段中使用它.数据库会更新,但adpater不会.以下是我的实施:
我的主要信息:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myArrayList = new ArrayList<myList>();
myArrayList = Database.getSharedObject(getActivity()).getMyList();
if (myArrayList != null && myArrayList.size() > 0) {
adapter = new myListAdapter(getActivity(), 0, myArrayList);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.mainfragment, container, false);
myListView = (ListView) v.findViewById(R.id.my_list_view);
myListView.setOnItemClickListener(this);
if (adapter != null) {
myListView.setAdapter(adapter);
}
return v;
}
Run Code Online (Sandbox Code Playgroud)
在一些导航过程之后,List得到了更新,在我的onResume()方法中,我从数据库中获取了更新的List,并且调用notifyDatasetChanged()了不更新视图的方法,但是更新了DB中相应的数组.
@Override
public void onResume() {
super.onResume();
myArrayList = …Run Code Online (Sandbox Code Playgroud) 我有一个ArrayAdapter包裹自定义对象的ArrayList.我想为该适配器编写一个自定义过滤器,这样当我调用getListAdapter().getFilter().filter("abc")列表时,将通过"abc"的任意转换过滤.
我想我会尝试覆盖ArrayAdapter.getFilter(),但这需要我重新实现私有ArrayAdapter.ArrayFilter,这需要访问一堆ArrayAdapter的私有实例.
最简单的方法是什么?
有什么区别
setContentView(R.layout.main);
Run Code Online (Sandbox Code Playgroud)
和
ArrayAdapter arrayAdapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_dropdown_item, sarray);
Run Code Online (Sandbox Code Playgroud)
R.layout和之间有什么区别android.R.layout?
我是android开发的新手.我正在尝试构建一个带有标签的应用程序(通过片段添加).在其中一个片段中,我试图显示一个列表.这个列表已经使用我从ArrayAdapter扩展的ListAdapter填充,并且我重载了getView()方法.这是我的片段
public class tabcontentActivity extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
return null;
}
View v = (LinearLayout) inflater.inflate(R.layout.tablayout, container,
false);
ListView lv = (ListView) v.findViewById(R.id.listview1);
ListViewAdapter adapter = new ListViewAdapter(container.getContext(),
android.R.layout.simple_list_item_1, R.id.textview1);
adapter.notifyDataSetChanged();
lv.setAdapter(adapter);
return v;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我实现ListAdapter的方法
public class ListViewAdapter extends ArrayAdapter {
Context context1;
public ListViewAdapter(Context context,int resource, int textViewResourceId) {
super(context,resource,textViewResourceId);
this.context1 = context;
System.out.println("here aswell!!!!!!");
// TODO Auto-generated constructor stub
}
public View getView(int …Run Code Online (Sandbox Code Playgroud) android android-arrayadapter android-layout android-fragments
这是我的代码
listview =(ListView) findViewById(R.id.lv1);
ArrayList<SClass> Monday = new ArrayList<SClass>();
SClass s1=new SClass();
s1.sName="samp";
s1.salary=1000;
Monday.add(s1);
temp=Monday;
adapter = new CustomAdap(this, temp);
listview.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常.但是当我将代码更改为此时
listview =(ListView) findViewById(R.id.lv1);
adapter = new CustomAdap(this, temp);
SClass s1=new SClass();
s1.sName="samp";
s1.salary=1000;
Monday.add(s1);
temp=Monday;
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
Listview没有显示任何内容.问题是什么?
我正在实现一个自定义ArrayAdapter<T>,我想将其设置hasStableIds为true.但我的T项的ID是字符串,getItemId方法返回long.
所以,我目前正在做的是:
@Override
public boolean hasStableIds() {
return true;
}
@Override
public long getItemId(int position) {
return this.getItem(position).getId().hashCode();
}
Run Code Online (Sandbox Code Playgroud)
当getId()返回一个字符串.
这是使用String ID的正确解决方案吗?
特别是,对于这种情况,String Ids是GUID,有更好的选择吗?
我有一个像这样的数组列表:
private ArrayList<Locations> Artist_Result = new ArrayList<Location>();
Run Code Online (Sandbox Code Playgroud)
此Location类有两个属性:id和location.
我需要将我绑定ArrayList到一个微调器.我这样试过:
Spinner s = (Spinner) findViewById(R.id.SpinnerSpcial);
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, Artist_Result);
s.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
但是,它显示对象的十六进制值.所以我想我必须设置显示该微调控制器的文本和值.
我在Welcome Activity上有一些基本代码,它像往常一样简单地绑定List适配器:
final ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, android.R.id.text1);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Run Code Online (Sandbox Code Playgroud)
这曾经有效,直到我更新到API级别25.此时,没有其他更改,微调器下拉列表的文本变得不可读:
我的主题的父级是"Theme.AppCompat.Light.NoActionBar",但同样,我没有玩那里的颜色,因为它显示正确(API <25)没有任何改变.任何的想法?
我知道我可以用一些setTextColor()内部修复它spinner.setOnItemSelectedListener(),但主要的一点是理解为什么它工作,现在它没有,因为这可能是我身边某些概念错误的标志,甚至某种Android bug.事实上,我注意到相同的问题(深色背景上的黑色文本)在非常标准的小部件/应用程序上,如Cyanogen/LineageOS默认天气一:
android ×9
listview ×4
arraylist ×1
baseadapter ×1
data-binding ×1
filter ×1
java ×1
layout ×1
listadapter ×1
spinner ×1