Android解析json数据并添加搜索功能

2024-01-03

抱歉我的英语不好。我是 android 新手,我将 json 数据解析到 listview 中,现在我想给他添加一个搜索功能,但我有一个问题,当我在 edittext 中输入单词时,然后在 listview 中输入我的项目是重复的,并且项目已经增加,请查看我的代码和屏幕截图。提前致谢,任何帮助将不胜感激。

我的艺术家活动:

    public class Artists extends Activity {

// Connection detector
        ConnectionDetector cd;

        // Alert dialog manager
        AlertDialogManager alert = new AlertDialogManager();

        // Progress Dialog
        private ProgressDialog pDialog;

        // Creating JSON Parser object
        JSONParser jsonParser = new JSONParser();
        // This is not using now if you want you can remove its all references :)
        ArrayList<HashMap<String, String>> albumsList;

        ArrayList<AdapterDTOArtist> mAdapterDTOs = null;
        private LazyAdapterArtist mLazyAdatper = null;

        private ArrayList<String> array_sort = new ArrayList<String>();
        int textlength = 0;

        // albums JSONArray
        JSONArray albums = null;

LinearLayout ll_artists_chart;
LinearLayout ll_artists_newrelease;
private EditText etSearch;

   private static String URL_ALBUMS = "http://triplevmusic.com/dev/webservice/index.php?op=fetch_artists.json";

// JSON Node names
private static final String TAG_CONTACTS = "data";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";

private ListView lv = null;
EditText et_artists_searchWord;
// contacts JSONArray
JSONArray contacts = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.artists);

    lv = (ListView) findViewById(R.id.artist_main_list_id);

    cd = new ConnectionDetector(getApplicationContext());

    // Check for internet connection
    if (!cd.isConnectingToInternet()) {
        // Internet Connection is not present
        alert.showAlertDialog(Artists.this,
                "Internet Connection Error",
                "Please connect to working Internet connection", false);
        // stop executing code by return
        return;
    }

    // Hashmap for ListView
            albumsList = new ArrayList<HashMap<String, String>>();
            mAdapterDTOs = new ArrayList<AdapterDTOArtist>();

            // Loading Albums JSON in Background Thread
            new LoadAlbums().execute();

            // get listview

            /**
             * Listview item click listener TrackListActivity will be lauched by
             * passing album id
             * */
            lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                        long arg3) {
                    // on selecting a single album

                }
            });


    ll_artists_chart = (LinearLayout) findViewById(R.id.ll_artists_chart);
    ll_artists_newrelease = (LinearLayout) findViewById(R.id.ll_artists_newrelease);
    et_artists_searchWord = (EditText) findViewById(R.id.et_artists_searchWord);

    et_artists_searchWord.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
        //  ((Filterable) Artists.this.mAdapterDTOs).getFilter().filter(s);
            List<AdapterDTOArtist> list = filter(s.toString(),mAdapterDTOs, true);
            mAdapterDTOs.addAll(list);
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    });

    ll_artists_chart.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(getBaseContext(), ChartActivity.class);
            startActivity(intent);
        //  finish();
        }
    });

    ll_artists_newrelease.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(getBaseContext(), NewReleases.class);
            startActivity(intent);
            //finish();
        }
    });



}

/**
 * Background Async Task to Load all Albums by making http request
 * */
class LoadAlbums extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(Artists.this);
        pDialog.setMessage("Listing Artists ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting Albums JSON
     * */
    protected String doInBackground(String... args) {
        // Building Parameters
        //List<NameValuePair> params = new ArrayList<NameValuePair>();
        ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

        // Creating JSON Parser instance
        JSONParser jParser = new JSONParser();

        JSONObject json = jParser.getJSONFromUrl(URL_ALBUMS);

        // getting JSON string from URL
        //String json = jsonParser.makeHttpRequest(URL_ALBUMS, "GET", params);

        // Check your log cat for JSON reponse
        Log.i("Albums JSON: ", "> " + json);

        try {
            //albums = new JSONArray(json);
            albums = json.getJSONArray(TAG_CONTACTS);

            if (albums != null) {
                // looping through All albums
                for (int i = 0; i < albums.length(); i++) {
                    JSONObject c = albums.getJSONObject(i);

                    // Storing each json item values in variable
                    String id = c.getString(TAG_ID);
                    String name = c.getString(TAG_NAME);

                    /*String EateryThmbnailUrl = c
                            .getString(TAG_THMBNAIL_URL);*/
                    // ~\/Uploads\/EateryImages\/\/7\/41283f1f-8e6f-42d4-b3c1-01f990efb428.gif
                    /*EateryThmbnailUrl = HOST_URL
                            + EateryThmbnailUrl.replace("~", "");*/

                    AdapterDTOArtist adapterDTO = new AdapterDTOArtist();

                    adapterDTO.setmTag_Id(id);
                    adapterDTO.setmTag_Name(name);


                //  adapterDTO.setmImage_URL(EateryThmbnailUrl);

                    mAdapterDTOs.add(adapterDTO);

                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();
                    HashMap<String, Integer> map1 = new HashMap<String, Integer>();

                    // adding each child node to HashMap key => value
                    map.put(TAG_ID, id);
                    map.put(TAG_NAME, name);


                    // adding HashList to ArrayList
                    albumsList.add(map);
                }
            } else {
                Log.d("Albums: ", "null");
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all albums
        pDialog.dismiss();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                /**
                 * Updating parsed JSON data into ListView
                 * */
                // updating listview
                mLazyAdatper = new LazyAdapterArtist(Artists.this,
                        mAdapterDTOs);
                lv.setAdapter(mLazyAdatper);

                // mLazyAdatper.setDataSet(mAdapterDTOs);

            }
        });

    }

}

public static List<AdapterDTOArtist> filter(String string,
        Iterable<AdapterDTOArtist> iterable, boolean byName) {
    if (iterable == null)
        return new LinkedList<AdapterDTOArtist>();
    else {
        List<AdapterDTOArtist> collected = new LinkedList<AdapterDTOArtist>();
        Iterator<AdapterDTOArtist> iterator = iterable.iterator();
        if (iterator == null)
            return collected;
        while (iterator.hasNext()) {
            AdapterDTOArtist item = iterator.next();
            collected.add(item);
        }
        return collected;
    }
}

}

我的 AdapterDTOArtist 类:

   public class AdapterDTOArtist {

private String mTag_Id;
private String mTag_Name;

public String getmTag_Name() {
    return mTag_Name;
}

public void setmTag_Name(String mTag_Name) {
    this.mTag_Name = mTag_Name;
}

public String getmTag_Id() {
    return mTag_Id;
}

public void setmTag_Id(String mTag_Id) {
    this.mTag_Id = mTag_Id;
}

}

我的 LazyAdapterArtist 类:

   public class LazyAdapterArtist extends BaseAdapter {

private Context mContext = null;
private ArrayList<AdapterDTOArtist> mAdapterDTOs = null;

public LazyAdapterArtist(Context context,
        ArrayList<AdapterDTOArtist> mAdapterDTOs2) {
    // TODO Auto-generated constructor stub
    this.mContext = context;
    this.mAdapterDTOs = mAdapterDTOs2;
}

public void setDataSet(ArrayList<AdapterDTOArtist> adapterDTOs) {
    this.mAdapterDTOs = adapterDTOs;
    notifyDataSetChanged();
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return mAdapterDTOs.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View row = convertView;
    ViewHolder mHolder = new ViewHolder();

    if (row == null) {
        // Cell is inflating for first time
        row = LayoutInflater.from(mContext)
                .inflate(com.whizpool.triplevmusic.R.layout.row_artists,
                        null, false);

        mHolder.mNameTxt = (TextView) row
                .findViewById(com.whizpool.triplevmusic.R.id.tv_row_artists);

        row.setTag(mHolder);

    } else {
        // recycling of cells
        mHolder = (ViewHolder) row.getTag();
    }

    mHolder.mNameTxt.setText(mAdapterDTOs.get(position).getmTag_Name());

    return row;
}

static class ViewHolder {

    TextView mNameTxt = null;

}
}

当将 json 数据解析到 listview 中时,我的应用程序如下所示:

当在编辑文本字段中输入单词时,我的应用程序如下所示:

我只是想,当我输入单词时,例如我输入“D”,然后在列表视图中仅显示那些起始词为“D”的单词。非常感谢,再次为我的英语感到抱歉。


问题是,当您过滤数据时,您会再次添加到mAdapterDTOs列出结果 您需要在添加结果之前清除列表。为了避免丢失数据,您必须将它们保存在单独的列表中,并且当用户计时时不会显示它们。

第 1 步:使用字段来保存数据备份(就像mAdapterDTOs):

    ArrayList<AdapterDTOArtist> mAdapterDTOs = null;
    ArrayList<AdapterDTOArtist> mAdapterDTOsBackup= null;

步骤 2:初始化该字段:

        mAdapterDTOs = new ArrayList<AdapterDTOArtist>();
        mAdapterDTOsBackup = new ArrayList<AdapterDTOArtist>();

步骤3:解析后将所有数据填充到备份集中:

 /**
 * getting Albums JSON
 * */
protected String doInBackground(String... args) {

        // HERE all your code as it is!!!

    // Just before return add a set keeping the backup of your data...
    // initialize the set just as mAdapterDTOs
    mAdapterDTOsBackup.addAll(mAdapterDTOs);
    return null;
}

第四步:从备份集中搜索过滤数据,然后添加到备份集中mAdapterDTOs不要忘记之前清除它。

et_artists_searchWord.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // TODO Auto-generated method stub
    //  ((Filterable) Artists.this.mAdapterDTOs).getFilter().filter(s);
        List<AdapterDTOArtist> list = filter(s.toString(),mAdapterDTOsBackup, true);
        mAdapterDTOs.clear(); // <--- clear the list before add
        mAdapterDTOs.addAll(list); // <--- here is the double add if you do not clear before
        mLazyAdatper.setDataSet(mAdapterDTOs);// update the adapter data (edit 2)
    }

Edit:为了更加清晰,分步拆分答案,该过程还添加了至少一行以显示添加每个代码片段的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android解析json数据并添加搜索功能 的相关文章

  • 将“R.id.myID”从字符串转换为 int 值 R.id.myID?

    我的观点上的文字代表一个ID 因此 当单击时 我想获得对该资源的引用 以下不正确的代码代表了我想要做的事情 public void onCreate Bundle savedInstanceState super onCreate save
  • 在 Android 模拟器上运行完整的 Android 手机 ROM

    正如标题所说 是否可以在 Android 模拟器中运行完整的 Android 设备 ROM 是的 你可以 但让它 100 工作可能很困难 大多数 ROM 都包含其运行硬件的特定驱动程序 我并不是 100 全力以赴 但可以尝试以下步骤 创建
  • 处理 SavedInstances 并恢复活动

    基本上我的应用程序有 2 个活动 说 A 和 B A 启动 B Activity B 播放音乐并且还有通知 情况 1 当视图仍在活动 B 上时 我按主页按钮 然后单击通知 活动 B 将打开 其视图完好无损并播放音乐 因为在清单中我使用 an
  • 如何检查 Android 设备是否在线

    我的服务器不断检查我的 Android 应用程序是否在线 请问我可以在我的android应用程序上执行哪些操作 创建一个名为 isNetworkAvailable 的帮助器方法 该方法将根据网络是否可用返回 true 或 false 它看起
  • adb 今天无法连接到 VirtualBox 中的 Android-x86

    我在 VirtualBox 中成功安装了 Android x86 v3 2 eeepc 一段时间 这是帮助我在 Android 上调试 USB 主机应用程序的好方法 此类配置的安装是 安装VirtualBox 将 Android x86 v
  • 使用全局变量从内部函数获取空字符串

    请帮助我解决一些小问题 我确信你能做到 D 我试图在 firestore 文档 user cases information 上设置一个字段 其中包含一个字段 case number 首先我声明这个全局变量 private String c
  • 如何在启用抗锯齿的情况下旋转可绘制对象

    我需要将 ImageView 旋转几度 我通过子类化 ImageView 和重载来做到这一点onDraw Override protected void onDraw Canvas canvas canvas save canvas sca
  • 改造将多个图像上传到单个密钥

    我正在使用 Retrofit 将图像上传到我的服务器 这里我需要为一个密钥上传多个图像 我已经尝试使用 Postman 网络客户端 它运行良好 这是一个屏幕截图 以下是请求的键值对 调查图像 文件1 文件2 文件3 属性图像 文件DRA j
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • Android 上的 SQLite JDBC 驱动程序

    我正在尝试使用xerial sqlite jdbc在 Android 中管理我的数据库没有成功 我得到了java lang NoClassDefFoundError org sqlite SQLiteConnection异常 我已经导入了这
  • 如何去掉android状态栏的电池图标?

    我通过去掉背景图像来删除 Android 中显示网络 电池和时间信息的状态栏 但图标仍然存在 我也想知道如何删除电池图标 不是用于应用程序 而是用于框架开发 提前致谢 你试过打电话吗 getWindow setFlags WindowMan
  • java.lang.AssertionError:CALL 'public final fun

    我正在尝试使用 jetPack Compose 制作一个项目 我拥有它工作所需的所有必要依赖项 但是当我运行我的应用程序时 它会抛出一个错误 我找不到解决方案 这是错误 java lang AssertionError CALL publi
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • Firebase 身份验证中是否需要 SMS Retriever API 才能进行 otp 自动填充?

    我在用Firebase auth api验证用户电话号码 目前 就我而言 我有一个屏幕 用户在其中输入电话号码 并在第二个屏幕上输入密码 根据文档firebase大多数时候自动检索 OTP 并启动验证过程 所以我的问题是它已经实现了SMS
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • Eclipse 在 Android SDK 内容加载器处挂起

    我已经在 OS X 10 8 2 上使用 Eclipse 4 2 Juno 版本 20120920 0800 几个星期了 为 Android 3 0 及更高版本构建应用程序 我有一台带 SSD 的四核 i7 MacBook Pro 因此性能
  • Android - 在图像/缩略图上覆盖播放按钮的最佳方式

    我有一个 Android 应用程序 可以播放音频 视频并显示图片 对于视频 我想在预览图像顶部以及列表视图中叠加一个播放按钮 现在我的做法是使用 xml 中的 ImageView 然后可绘制对象是一个图层图层列表 我以编程方式定义它 因为其
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • Dart/Flutter 如何编译到 Android?

    我找不到任何具体的资源 Dart 是否被编译到 JVM 或者 Google 的团队是否编译了 Dart VM 以在 JVM 上运行 然后在 JVM 内的 Dart VM 中运行 Dart 前者更有意义 并且符合 无桥 的口号 但后者似乎更符
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客

随机推荐

  • 在 Mac 上创建 SQL 数据库

    我想在我的 Mac 上创建 SQL 数据库 我想知道我可以用来创建 操作它的最佳软件是什么 任何建议将不胜感激 Postgres Postgres http www postgresql org 是一个成熟的重型企业级数据库系统 Postg
  • 是否可以仅捕获屏幕的一部分,甚至捕获另一个应用程序的特定视图?

    Android 允许使用 MediaProjection 类 如图所示 将全屏捕获为图像或视频here https github com mtsahakis MediaProjectionDemo例如图像 我想知道我们能走多远 是否可以仅捕
  • 如何将 findbugs @Nonnull 与外部库一起使用?

    我开始使用 findbugs Nonnull and CheckForNull在现有项目上添加注释 以防止 NPE 并且认为它效果很好 我用 Nonnull作为返回类型和参数的默认值 只需添加默认值 就已经发现了一些 NPE 现在我找到了类
  • 代理密钥、合成密钥和人工密钥之间有区别吗?

    代理密钥 合成密钥和人工密钥之间有什么区别吗 我不清楚具体的区别 代理密钥 合成密钥和人工密钥是同义词 技术关键是另一个 它们的意思都是 没有商业意义的主键 它们与自然密钥或业务密钥不同 后者的含义超出了当前系统的范围 例如 考虑 SO 用
  • span 和 label 标签之间的渲染差异是什么?

    所以我理解跨度和标签标签之间的功能差异 但是标签之间似乎也存在渲染差异 我似乎无法弄清楚它是什么 有谁知道span和label之间的渲染差异 谢谢 除了默认的渲染样式 标签有时在某些浏览器中为粗体 之外 重要的区别是标签应该链接到表单字段
  • 在 JavaFX 中使用数据库填充表视图

    我开始学习 javaFX 我需要用数据库中的数据填充表 我在网上阅读了很多代码 但没有找到我想要的东西 我读this http pastebin com S0Fg9jK8但我不知道如何实现最后一个功能 我阅读了一些其他代码来做到这一点 到目
  • Java:实现无符号 128 位整数

    首先我应该问 有谁知道 Java 的当前实现 128b UINT 吗 我需要一些东西来保持自然的基本价值观 即 一个巨大的柜台 我知道 BigIntegers 它很慢而且不可变 128b UINT 有意义 我正在考虑使用一对原始长整型来实现
  • Regex101 与 JavaScript String.match 分歧

    这个正则表达式 w g应该匹配每个单词字符between大括号 相反 我得到了不同的结果Regex101 JavaScript 引擎 https regex101 com r iD4uP6 1 and Chrome 控制台 Regex101
  • MongoEngine - 另一个用户已通过此数据库的身份验证。您必须先退出

    谁能解释一下为什么我收到错误另一个用户已通过此数据库的身份验证 您必须先退出当使用连接到 MongoDB 时Flask Mongo引擎 https github com MongoEngine flask mongoengine from
  • 在 Prolog 中断言数字谓词

    Prolog 中是否有可能断言代表数字的事实 例如 我想使用谓词distance 2并断言诸如distance town1 city2 1200 The distance town1 city2 1200term 是该术语的语法糖 dist
  • 如何引导 log4j 输出,以便不同的日志级别发送到不同的附加程序?

    是否可以将 debug 和 info 输出写入控制台 而 info 输出仅写入某个日志文件 例如 给定以下日志记录 LOG debug fileContent LOG info fileLength 对应的是什么log4j xml看起来像
  • MongoDB,如何对文档进行分组

    我的收藏有这样的数据 code 1 location 1 QUEEN STREET id 1 code 1 location 2 KING STREET id 2 code 2 location 1 QUEEN STREET id 3 co
  • 不请求Window.FEATURE_ACTION_BAR问题

    我正在尝试构建我的应用程序 但没有成功 我尝试了多种方法 但没有任何效果 例外的是 Caused by java lang IllegalStateException This Activity already has an action
  • 如何创建一个不可销毁的实例

    想象一下我有一堂课 TCantBeDestroyed 有人知道如何直接创建一种在两种情况下都不能被销毁的实例 不能被毁坏 免费 CantBeDestroyed Destroy 并且不能被演员摧毁 TObject CantBeDestroye
  • 根据时间序列数据帧的时间列更正日期列中的条目

    我有一个时间序列数据框 它包含三列 日期 时间和值 它看起来像这样 date time value 11 03 2020 1103 5 11 03 2020 0000 10 11 03 2020 0100 6 12 03 2020 0201
  • 层次聚类大稀疏距离矩阵 R

    我试图在非常大的距离上执行 fastclust 但遇到了问题 我有一个非常大的 csv 文件 大约 9100 万行 因此 for 循环在 R 中花费太长时间 其中包含关键字 大约 50 000 个唯一关键字 之间的相似性 当我读入 data
  • sfErrorNotifierPlugin:“默认”上下文不存在

    我已经安装了sfErrorNotifierPlugin 当两个选项reportErrors reportPHPErrorsreportPHPWarnings reportWarnings都设置为false时 一切正常 但我想捕获 PHP 异
  • 删除前导 0 直至小数点

    我想删除小数中的前导零 所以我想要的输出应该是 324 not 0 324 我试过str replaceFirst 0 没用 我也尝试了正则表达式 没有结果 是的 我正在使用 BigDecimal Try this str str repl
  • 发布到数据:url — 有任何用例吗?

    在当前的 HTML5 规范中 可以POST具有数据方案的动作的表单 http www w3 org TR 2011 WD html5 20110525 association of controls and forms html form
  • Android解析json数据并添加搜索功能

    抱歉我的英语不好 我是 android 新手 我将 json 数据解析到 listview 中 现在我想给他添加一个搜索功能 但我有一个问题 当我在 edittext 中输入单词时 然后在 listview 中输入我的项目是重复的 并且项目