gpt4 book ai didi

java - 动态内容的 BaseAdaptor 用法

转载 作者:行者123 更新时间:2023-12-01 15:38:37 25 4
gpt4 key购买 nike

我目前正在做一些在 ListView 中列出项目的 Android 开发人员,我们创建了一个 WebView,它将 JavaScript 接口(interface)添加到我们的页面,并且我们的页面通过JavaScript 界面。这一切都按预期工作,因此我们设置了一个名为 HangoutManager 的类,它扩展了 BaseAdapter,我们在其中实现了多种方法,例如 add/删除并且存在

这一切都工作正常,现在当数组堆栈发生更改时,需要使用BaseAdapter来更新ViewList

我们似乎无法让它发挥作用,getView() 函数永远不会被调用来生成项目。这是一些代码。

创建时

public void onCreate(Bundle savedInstanceState)
{
//Call parent to construct the Activity
super.onCreate(savedInstanceState);

//Create Instance of HangoutManager, must be called here
HangoutManagerList = HangoutManager.Instance(this);

//Set the content view to the main ListView
setContentView(R.layout.main);

//instantiate the WebView
CanopyWebView = new CanopyWebView(this);

setListAdapter(HangoutManagerList);
}

环聊管理器

public class HangoutManager extends BaseAdapter
{
public static HangoutManager _Instance;
private ArrayList<JSONObject> DataSet = new ArrayList<JSONObject>();

protected LayoutInflater Inflater;

public static HangoutManager Instance(Context context)
{
if(_Instance == null)
{
_Instance = new HangoutManager(context);
Log.v("HangoutManager", "Instance Created");
}

return _Instance;
}

public HangoutManager(Context context)
{
this.Inflater = LayoutInflater.from(context);
}

public boolean remove(String id)
{
try
{
for(int i=0 ; i< DataSet.size() ; i++ )
{

if(DataSet.get(i).getString("id").equals(id))
{
DataSet.remove(i);
Log.v("HangoutManager", "hangout Removed");
return true;
}
}
}
catch (JSONException e)
{
Log.e("HangoutManager::exists",e.getMessage());
return false;
}

return false;
}

public boolean add(String hangout)
{
try
{
JSONObject HangoutJson = new JSONObject(hangout);
if(this.exists(HangoutJson.getString("id")))
{
this.remove(HangoutJson.getString("id"));
}

DataSet.add(HangoutJson);
Log.v("HangoutManager", "hangout Added");

notifyDataSetChanged();

}
catch(JSONException e)
{
Log.e("HangoutManager",e.getMessage());
}
return true;
}


public boolean exists(String id)
{
try
{
for(int i=0 ; i< DataSet.size() ; i++ )
{
if(DataSet.get(i).getString("id").equals(id))
{
Log.v("HangoutManager", "hangoutExists: " + id);
return true;
}
}
}
catch (JSONException e)
{
Log.e("HangoutManager::exists",e.getMessage());
return false;
}
return false;
}

@Override
public int getCount()
{
return DataSet.size();
}

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

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

@Override
public View getView(int position, View view, ViewGroup viewGroup)
{

if(view == null)
{
view = Inflater.inflate(R.layout.item1, viewGroup, false);
}

//Get the JSONObject for the Item
JSONObject entity = DataSet.get(position);

//Set the JSONObject as the tag for the row
view.setTag(entity);

//return the view to be drawn
return view;
}
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000"
android:id="@android:id/list">
</ListView>

item1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="fill_parent">

<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:background="#FFFFFFFF"
android:gravity="center_vertical"
android:text="@string/app_name"
android:textColor="#FF000000"
android:visibility="visible" />

</LinearLayout>

StackTrace(不是错误堆栈跟踪)

关于的部分是我们尝试打破但它永远不会打破的地方,我们做错了什么吗?

更新

应用程序似乎在 notifyDataSetChanged() 调用期间崩溃。

最佳答案

你不应该这样调用充气器。使用以下语法从 getView() 获取要使用的 Inflater

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

关于堆栈跟踪,看起来你的 JS 接口(interface)回调是在后台执行的。您不能修改绑定(bind)到ListView的数据集合,也不能从后台线程调用updateNotifyDataset()

但是你可以通过调用你的 add 方法来要求 UIThread 为你做这件事,如下所示:

yourActivityInstance.runOnUiThread(new Runnable() {
public void run() {
yourAdapterInstance.add(newHangout);
}});

关于java - 动态内容的 BaseAdaptor 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8446354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com