自定义列表适配器中的getApplicationContext()

时间:2018-03-31 07:58:51

标签: java android android-fragments backgroundworker

我的代码在我的Fragment Class中有效,但在我的List Adapter中没有:

<!DOCTYPE html>
<html>
<head>
    <title>PHP - dependent dropdown list</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>

  <div class="container">
    <h2>Modal Example</h2>
    <!-- Trigger the modal with a button -->
    <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button>

    <!-- Modal -->
    <div class="modal fade" id="myModal" role="dialog">
      <div class="modal-dialog">

        <!-- Modal content-->
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal">&times;</button>
            <h4 class="modal-title">Select State and get bellow Related City</h4>
          </div>
          <div class="modal-body">
            <div class="form-group">
                  <label for="title">Select State:</label>
                  <select name="state" class="form-control">
                      <option value="">--- Select State ---</option>
                      <?php
                        require('db_config.php');
                          $sql = "SELECT * FROM demo_state"; 
                          $result = $mysqli->query($sql);
                          while($row = $result->fetch_assoc()){
                              echo "<option value='".$row['id']."'>".$row['name']."</option>";
                          }
                      ?>
                  </select>
              </div>
              <div class="form-group">
                  <label for="title">Select City:</label>
                  <select name="city" class="form-control" style="width:350px">
                  </select>
              </div>
              <button type="submit">submit</button>
          </div>

        </div>

      </div>
    </div>


    <script>
      $( "select[name='state']" ).change(function () {
          var stateID = $(this).val();
          if(stateID) {
              $.ajax({
                  url: "ajaxpro.php",
                  dataType: 'Json',
                  data: {'id':stateID},
                  success: function(data) {
                      $('select[name="city"]').empty();
                      $.each(data, function(key, value) {
                          $('select[name="city"]').append('<option value="'+ key +'">'+ value +'</option>');
                      });
                  }
              });
          }else{
              $('select[name="city"]').empty();
          }
      });
    </script>


  </div>

</body>
</html>

当我需要将此代码放入List List中时,&#39; getApplicationContext&#39;部分是&#34;错误&#34;。如何解决此问题并在我的列表适配器中使用此代码。 (班级在&#39; Tab2&#39;),

4 个答案:

答案 0 :(得分:1)

你可以

  • context传递给您的adapter's构造函数

  • context中使用的views开始adpater

  

要在活动中夸大布局,您需要 Activity 上下文而非 ApplicationContext !!

答案 1 :(得分:0)

您可以将ApplicationContext的引用传递给列表适配器:

 new ListAdapter(getActivity().getApplicationContext(), anotherArgs);

顺便说一下,您可以从任何View类中获取Context,我确信您的适配器可以访问父视图类来创建行项目视图。

答案 2 :(得分:0)

您必须将活动上下文作为参数传递给适配器的构造函数,并将其分配给本地上下文变量。

例如:

 public class CustomAdapter extends ArrayAdapter<YourModelclass> {

        private ArrayList<YourModelclass> list;

        Context mContext;

 public CustomAdapter(ArrayList<YourModelclass> list, Context context) {
            this.list = list;
            this.mContext=context;

        }

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

在上面的代码中,您可以使用本地上下文,然后访问任何方法。

这是因为,

片段始终映射到活动,因此可以在Fragment类中访问GetActivity方法。

GetActivity返回一个Activity上下文,该上下文可以访问GetApplicationContext方法

但是在适配器中,GetActivity没有任何意义,因为它没有绑定到某个活动,也没有绑定到它的父活动。

希望这有帮助!!!

答案 3 :(得分:0)

你可以用两种方式做到这一点

  1. 从您的活动或片段

  2. context传递给您的Adapter's构造函数
  3. context中使用的views获取adpater。您可以直接从视图中查询上下文,例如viewObject.getContext().getApplicationContext()

  4. 还要记住,如果你需要膨胀视图,你将需要Activity的上下文,因为应用程序上下文在那里不起作用。每个上下文(Activity,application,baseContext等)都有不同的职责,并提供不同的设施。你必须根据需要选择。 这也是非常基本的事情。你必须学习android组件中的基本上下文用法。